如何提高该代码算法的效率?使用该算法后的代码将是什么?如何避免该程序超出时间限制?

时间:2019-03-28 15:06:06

标签: c algorithm

我有这个问题:

一些正整数可以由一个或多个连续质数之和表示。给定的正整数有多少个此类表示形式?

例如,整数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;
}

1 个答案:

答案 0 :(得分:0)

您的代码超时,是因为您不断重新计算已经知道的内容:

  1. 您正在重新计算每个查询的所有素数(您可以 在查询开始之前预先计算所有需要的素数)

  2. 您正在重新计算已经知道的东西。 (即,如果有 查询,要求对某些整数x的表示形式进行计数,并且 然后稍后其他一些查询也问同样的事情,您真的需要再次计算答案吗?)

建议:

  1. 只有10000个可能的查询,因此只需创建数组 回答[10001],并填写所有可能的答案。

  2. 10000并不多,因此您甚至可以将所有答案保存在文件中, 将其硬编码为代码中的数组,因此所有查询都将在 每个查询为O(1)