[C++] 纯文本查看 复制代码 这段代码的问题在于pd函数中的素数筛选不正确,导致在判断一个数是否为素数时出现了错误。具体来说,问题出现在以下代码段:
int a[100000];
for(int i=2;i<=x;i++)
{
if(a==0) // 这里应该是a==0
for(int j=i+i;j<=10000;j+=i)
a[j]=i;
}
在这段代码中,你声明了一个数组a,然后进行了筛选,将数组中的合数标记为其最小质因子。然而,在筛选的过程中,你使用了一个错误的判断条件a==0,应该改为a==0。因为你想要判断第i个数是否是质数,而不是判断a数组是否为0。
因此,修改后的pd函数应该如下所示:
int pd(int x)
{
int a[100000];
memset(a, 0, sizeof(a)); // 初始化为0
for (int i = 2; i <= x; i++)
{
if (a == 0) // 判断a是否已经被标记过
for (int j = i + i; j <= x; j += i)
a[j] = i;
}
if (a[x] == 0)
return 1;
return 2;
}
此外,你在判断一个数是否为“吉祥数”时,只检查了该数是否为素数,然而这并不足以保证它是“吉祥数”。因此,你需要在判断时同时验证该数的各位数字之和是否等于其各个质因子(如果有的话)的各位数字之和。修改后的代码如下:
int pd(int x)
{
int a[100000];
memset(a, 0, sizeof(a)); // 初始化为0
for (int i = 2; i <= x; i++)
{
if (a == 0) // 判断a是否已经被标记过
for (int j = i + i; j <= x; j += i)
a[j] = i;
}
// 判断各位数字之和是否等于各个质因子的各位数字之和
int sum1 = 0, sum2 = 0;
int tmp = x;
while (tmp > 0)
{
sum1 += tmp % 10;
tmp /= 10;
}
tmp = x;
while (tmp > 1)
{
int factor = a[tmp] == 0 ? tmp : a[tmp];
int factor_sum = 0;
while (factor > 0)
{
factor_sum += factor % 10;
factor /= 10;
}
sum2 += factor_sum;
tmp /= factor;
}
if (a[x] == 0 && sum1 == sum2)
return 1;
return 2;
}
经过以上修改,你的程序应该可以得到满分了。
|