我有这个问题:
一些正整数可以由一个或多个连续质数之和表示。给定的正整数有多少个此类表示形式?
例如,整数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的有效表示。
任务是编写一个报告给定正整数表示形式的程序。
样本输入:
2
3
17
41
20
666
12
53
0
样本输出:
1
1
2
3
0
0
1
2
我用seive方法获得素数数组p [10011]。 我的代码是:
#include <stdio.h>
int main()
{
int n, i, j, k, l, sum, count, ara[10011], d[10011];
while (-1)
{
for (i = 2; i <= n; i++)
{
ara[i] = 0;
}
l = 0;
while (1)
{
k = 0;
scanf("%d", &n);
int p[n];
count = 0;
for (i = 2; i <= n; i++)
{
if (ara[i] == 0)
{
for (j = 2 * i; j <= n; j += i)
{
ara[j] = 1;
}
}
}
for (i = 2; i <= n; i++)
{
if (ara[i] == 0)
{
p[k++] = i;
}
}
for (i = 2; i <= n; i++)
{
if (ara[i] == 0)
{
p[k++] = i;
}
}
for (i = 0; i < k; i++)
{
sum = 0;
for (j = i; j < k; j++)
{
sum += p[j];
if (sum == n)
{
count++;
break;
}
}
}
d[l] = count;
if (n == 0)
break;
l++;
}
for (i = 0; i < l; i++)
{
printf("%d\n", d[i] / 2);
}
}
return 0;
}
答案 0 :(得分:0)
您的代码超时,是因为您不断重新计算已经知道的内容:
您正在重新计算每个查询的所有素数(您可以 在查询开始之前预先计算所有需要的素数)
您正在重新计算已经知道的东西。 (即,如果有 查询,要求对某些整数x的表示形式进行计数,并且 然后稍后其他一些查询也问同样的事情,您真的需要再次计算答案吗?)
建议:
只有10000个可能的查询,因此只需创建数组 回答[10001],并填写所有可能的答案。
10000并不多,因此您甚至可以将所有答案保存在文件中, 将其硬编码为代码中的数组,因此所有查询都将在 每个查询为O(1)