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;
}

先说你代码问题再给你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;
}


你先用筛法求素数,放一个数组里
然后二重for循环遍历数组
从头到尾往后加,如果相等就是一组解,如果和已经大于数字本身了就结束循环

题目链接能不能发一下
试试你的sr[30]换大一点可不可以
比如sr[1000]之类的

段错误,最常见的就是数组越界,你的sr数组设置上限才30,也就是说他输入最多只能30行,题目要是没有说最多输入多少行的话,输入31行的时候你的sr数组就越界了,就会报段错误

这块有问题:

img

img


没有错误,变量名别叫and,这是系统关键字。

and是个关键字