我需要制作一个程序,例如当给定数字879时必须检查该数字是否为素数以及它的所有数字子序列是否为素数意义87,79,8,7,9等。到目前为止我'我做了一个函数,检查一个数字是否是素数,但不知道如何将数字分成数字子序列。
答案 0 :(得分:2)
让x
为数字。您可以先确定n
的位数x
。例如,如果x = 543689
则n = 6
。这很容易通过对数来确定,例如(可通过math.h
获得)。 x
中的每个数字都有一个地址i
,范围为0,1,...,n-1
。使用从右到左排序是很自然的,因此在上面的例子中i=0
对应于数字9而不是5。
设置一个嵌套的for循环,循环遍历所有索引i,j
和0 <= i <= j <n
。对于内部循环的每次传递,您需要使用起始索引i
和结束索引j
来获取数字。您可以分两步完成此操作
1)让y = x % (10^(j+1))
。这将使y
等于最左边的数字是索引j
的子字符串。例如,如果x = 543689
和j = 4
则10^5 = 100000
和543689 % 100000 = 43689
- 从索引4开始的子序列。
2)将y
除以10^i
- 这会将一切都扔到地方i
。例如,如果i=2
和y = 43689
则y / 100 = 436
。请注意,436是543689的一部分,最左边的索引4和最右边的索引2。
C没有内置电源操作器。你可以适当地初始化int
变量以保持权力10^(j+1)
和10^i
并在每次循环中适当地更新这些权力(乘以10)。
这是这些想法的Python实现(Python,因为我不想给C,因为这听起来像家庭作业)。唯一不可能解释的是//
- 这是Python中的整数除法。在C中,您可以使用/
- 假设您正在处理int
个变量:
x = 879
n = 3
for i in range(n):
for j in range(i,n):
y = x % 10**(j+1)
y = y // 10**i
print(y)
输出:
9
79
879
7
87
8
答案 1 :(得分:1)
你也可以使用它(来源:find all subsequences of a number)
#include <stdio.h>
#define NUM 154
int main(void) {
int i,num=NUM,x,y,mask,digits=0,max=1;
while ( num != 0 ) {
num /= 10;
digits++;
}
for ( i = 1; i <= digits; i++ ) {
max *= 2;
}
printf("Subsequences are:\n");
for ( i = 1; i < max - 1 ; i++ ) {
mask = i;
x = 1;
num = NUM;
y=0;
while ( num != 0 ) {
if ( mask % 2 == 1 ) {
y += num % 10 * x;
x *= 10;
}
num /= 10;
mask /= 2;
}
printf("%d \n" , y);
}
return 0;
}
答案 2 :(得分:0)
您可以使用:
void chckdigits(int number)
{
int digits[10]= {0};
int i= 0;
while (number) {
digits[i]= number%10; // array is in reverse
number= number/10;
i++;
}
// now check all permutations
}
答案 3 :(得分:0)
#include <stdio.h>
void isPrime(int n){
printf("%d is ...\n", n);
}
int main (void){
int theNumber = 879;
int base = 10;
int n, sub_n;
do {
for(n = theNumber; n >= base/10; n /= 10){
sub_n = n % base;
isPrime(sub_n);
}
base *= 10;
} while(sub_n != theNumber);
return 0;
}