不能这样子算啊,假如他输入了100个3 ,那么你就会打印出一堆来,而不是 只有 3
我写了个代码给你:
有不懂的可以问我。
#include <stdio.h>
#include <math.h>
void getBitmap( char * bitmap , int num );
bool IsPrimeNumber( int x );
bool Get_bit(char * st ,int num );
void Set_bit(char * st ,int num );
int main() {
int inputNum = 0;
int inputList[20] = {0};
char bitmap[1000] = {0};
printf("请您输入您要输入的数字个数:");
scanf("%d", &inputNum);
printf("请依次输入您要输入的数字:");
for (int i = 0; i < inputNum && i < 20; i++) {
scanf("%d", &inputList[i]);
// 找到 这个数分解后的素数
getBitmap(bitmap,inputList[i]);
}
for( int i = 0 ; i < 8000 ; i++ ){
if( Get_bit(bitmap,i) ){
printf("%d",i);
}
}
}
void getBitmap( char * bitmap , int num ){
// 从2 开始
for( int i = 2 ; i <= num ; i++ ){
// 如果 i 可以被 num 整除
if( num % i == 0 ){
// 并且num也是素数的话
if( IsPrimeNumber(i) ){
// 就把 i 保存下来
Set_bit(bitmap,i);
}
}
}
}
bool IsPrimeNumber( int x ){
// 遍历除 1 以外所有比自己小的整数
int sq = sqrt(x);
for( int i = 2 ; i <= sq; i++ ){
if( x%i == 0 ){
// 如果 x 可以被 i 整除 那么就返回的 假 代表这个数不是素数
return false;
} else { /* 如果不能被 i 整除就继续遍历 */ }
}
// 如果除 1 以外所有比自己小的整数都不能被整除,那么他就是素数
if( x <= 1 ){
// 小于 2 的数一定不是素数
return false;
} else {
// 是素数
return true;
}
}
bool Get_bit(char * st , int num ){
// 用一个数组保存下数字有没有的信息
return ( st[(int)(num/8)] & (0x01 << (num % 8) ) ) > 0 ? true : false ;
}
void Set_bit(char * st , int num ){
// 读取这个数字有没有
st[(int)(num/8)] |= (0x01 << (num % 8) ) ;
}