m0_63355211 2021-12-09 14:53 采纳率: 100%
浏览 296
已结题

编写程序,从控制台读入一组合数(小于等于20个,且每个合数的大小不会超过int数据类型表示的范围),求这些合数分解成素数的最小集

编写程序,从控制台读入一组合数(小于等于20个,且每个合数的大小不会超过int数据类型表示的范围),求这些合数分解成素数的最小集。该最小素数集是所有合数分解成的素数的并集,并且重复的素数只保留一个。按从小到大的顺序输出求得的最小素数集。

【输入形式】

先从控制台输入合数的个数,然后在下一行输入所有合数,各合数之间以一个空格分隔。

【输出形式】

在标准输出上按从小到大顺序输出求得的最小素数集,各素数之间以一个空格分隔,最后一个整数后也可以有一个空格。

【输入样例】

5
20 200 3456650 687 12308760

【输出样例】

2 3 5 29 131 229 257 269

  • 写回答

1条回答 默认 最新

  • 技术专家团-Bamboo 2021-12-10 10:06
    关注
    #include<stdio.h>
    int b[100000], res[100000];
    int isPrime(int n) {
        int i;
        for(i = 2; i * i <= n; i++) {
            if(n % i == 0)
                return 0;
        }
        return 1;
    }
    int main() {
        int n, t, len = 0, i, j, a;
        scanf("%d", &n);
        for(i = 0; i < n; i++) {
            scanf("%d", &a);
            t = 2;
            while(a != 1) {
                if(a % t == 0 && isPrime(t) ) {
                    a /= t;
                    if( b[t] == 0) {
                        b[t] = 1;
                        res[len++] = t;
                    }
                } else {
                    t++;
                }
            }
        }
        for(i = 0; i < len - 1; i++) {
            for(j = 0; j < len - i - 1; j++) {
                if(res[j] > res[j + 1]) {
                    t = res[j];
                    res[j] = res[j + 1];
                    res[j + 1] = t;
                }
            }
        }
        for(i = 0; i < len; i++) {
            printf("%d ", res[i]);
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月20日
  • 已采纳回答 12月12日
  • 创建了问题 12月9日

悬赏问题

  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 个人网站被恶意大量访问,怎么办
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制