I_lived 2022-03-03 12:59 采纳率: 100%
浏览 175
已结题

c语言 我的代码出现问题但是我找不到,如何解决?

本人c语言初学者,在pta上做题过程中,我的代码符合题目要求也能运行,但是最后出现了段错误,但是找不到错误在哪。

题目
(有一些正整数可以分解为一个或连续多个素数的和。给定一个正整数,有多少种可能的分解方式?例如,53可以分解为 5 + 7 + 11 + 13 + 17和53。整数41有三种分解方式,即2+3+5+7+11+13, 11+13+17和41。而整数3只有一种分解方式,即3。整数20无法分解为连续素数的和。 注意:在分解一个整数时,素数必须是连续的, 因此7 + 13 和 3 + 5 + 5 + 7 都不是20的有效分解方式,因为7和13之间有一个素数11,而 3 + 5 + 5 + 7这种分解方式中5重复出现了。)

请编写一个程序,对于给定的一个正整数,输出其有效的分解方式有多少。

输入:
每行给出一个正整数,其值在2到10000之间,包括2和10000。遇到0时代表输入结束,并且0不用分解。

输出:
输出由多行组成。每行对应输入的一行(输入中由0结束的行除外),该行的值对应输入中整数的有效素数分解的个数,行尾不得有多余的符号

输入样例
2
3
17
41
20
666
12
53
0

输出样例
1
1
2
3
0
0
1
2

代码:(变量设置的有点乱 请见谅)

#include <stdio.h>
int main()
{
    int PD(int pd);//声明函数
    int o;
    int sr[30],x=0;
    for(;;)
        {
            if(scanf("%d",&sr[x])==1)
            {
            if(sr[x]==0)
                break;
            x++;
            }
        }//输入一组数据储存在名为sr的数组中
    for(int a=0;a<x;a++)
    {
        o=sr[a];
        PD(o);
    }//调用PD函数
    return 0;
}

int PD(int pd)
{
    int su[1229],and,q=0,number=0,w;//小于10000的所有素数有1229个
    for(int n=1;n<=pd;n++)
    {
        for(int i=2;i<=n;i++)
        {
            if(i==n)
            {
             su[q]=n;
             q++;
            }
            else if(n%i==0)
                break;
        }
    }   //生成小于pd的所有素数,并安置在su数组中
    for(int r=0;r<q;r++)
    {
        and=0;
        for(w=r;w<q;w++)
        {
            and=and+su[w];
            if(and==pd)
            {
                number++;
            }
            if(and>pd)
            break;
        }
    }   //穷举法,用number标出该数的所有分解方式
        printf("%d\n",number);
    return 0;
}
  • 写回答

7条回答 默认 最新

  • 码诅 2022-03-03 16:41
    关注

    先说你代码问题再给你ac的代码。
    问题1. sr太小了,而且这个数组没必要。这种算法题不必等着读入完毕再处理,可以输入一个处理一个
    问题2. 生成小于pd的所有素数这个for循环,只需要执行一次,应该放在main中就行了,放在PD函数里面,每次执行太浪费时间
    问题3. 判断是不是素数只需要ii<= n就行了,因为如果n%i==0,那么n%(n/i)==也可以。就相当于i(n/i)=n
    问题4 and在C++是关键字,虽然在C不是关键字,但是也要注意一下
    另外你代码太多冗余了,我就你代码的基础上进行了优化,思路还是你的思路

    ac的代码在下面,没问题的话,请点击采纳答案

    #include <stdio.h>
    int su[1229], sum, q; //小于10000的所有素数有1229个, and在C++中是关键字,改成了Sum
    
    int PD(int pd) {
        int number = 0, w;
        for (int r = 0; r < q; r++) {
            //穷举法,用number标出该数的所有分解方式
            sum = 0;
            for (w = r; w < q; w++) {
                sum = sum + su[w];
                if (sum == pd) {
                    number++;
                }
                if (sum > pd)
                    break;
            }
        }
        printf("%d\n", number);
        return 0;
    }
    int main() {
    
        for (int n = 2; n <= 10000; n++) {
            //生成小于pd的所有素数,并安置在su数组中
            int i;
            for (i = 2; i * i <= n; i++) {
                // i只需要枚举到 根号n即可
                if (n % i == 0)
                    break;
            }
            if (i * i > n) su[q++] = n;
        }
        int x;
        while (scanf("%d", &x), x) {
            PD(x);
        }
    
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 3月14日
  • 已采纳回答 3月6日
  • 修改了问题 3月3日
  • 修改了问题 3月3日
  • 展开全部

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 Ubuntu20.04无法连接GitHub
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥30 C++行情软件的tick数据如何高效的合成K线