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