c语言问题求解,素数问题

//由数学基本定理可知:任何- -个大于1的非素数整数都可以唯一分解成若千个素数的乘积。编写程序,从控制台读入一组大于1的整数(小于等于20个,且每个整数的大小不会超过int数据类型 表示的范围), ,求这些整数分解成素数的最小集。该最小素数集是所有整数分解成的素数的并集 (若输入的整数是素数,则该素数可以直接加入最小素数集),并日重复的素数只保留一个。 按从小到大的顺序输出求得的最小素数集
int main()
{
int a,num1[100],b=1,n,i,m,j;
printf("请您输入您要输入的数字个数:");
scanf("%d",&a);
printf("请依次输入您要输入的数字:");
for(n=1;n<=a;n++)
{
scanf("%d",&i);
b=b*i;

}
printf("%d",b);
for(m=2;m<=b;m++)
{
 if(b%m==0)
 num1[m-2]=b;
 b=b/m;    
}
for(j=0;;j++)
if(num1[j]==0)
{
  break;    
}
else
printf("%d",num1[j]);

}

//遇到的问题就是编译成功之后,运行结果不对

不能这样子算啊,假如他输入了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) ) ;
}

http://t.csdn.cn/Ro1mk
看看这篇文章可以吗?
有用记得采纳呐!