m0_74469865 2022-11-01 19:46 采纳率: 100%
浏览 225
已结题

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]);

}

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

  • 写回答

3条回答 默认 最新

  • 谢玄. 2022-11-01 20:00
    关注

    不能这样子算啊,假如他输入了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) ) ;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月10日
  • 已采纳回答 11月2日
  • 创建了问题 11月1日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境