我正在编写一个找到素数总和的程序。它必须使用重定向输入。我写了它,以便它找到输入的最大数字,然后使用它作为第n个素数。然后使用第n个素数来设置数组的大小。它一直有效,直到我尝试打印总和。我无法弄清楚为什么我在那里得到一个seg故障。我想我已经使用malloc正确分配了数组。为什么在我使用我的阵列时,错误发生在printf上?我们也欢迎对我的代码提出任何建议。
EDIT 使用2000表格1到2000的测试输入并且它工作但10000个表格1到10000崩溃的完整测试文件仍在调查原因。我猜我没有分配足够的空间
EDIT 我的问题是在我的筛子中我没有采取sqrt(nthprime)所以它找到了更多的素数然后阵列可以容纳
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int nprime (int max);
void sieve_sum ( int *primes, int nthprime, int tests,int *input);
int main(void)
{
int i=0;
int max=0; //largest input
int tests; //number of tests
int nthprime; //estimated nth prime
int *primes; //array of primes
int *input; // numbers to put in to P(n), where p(n) is the summation of primes
scanf("%d",&tests); //gets number of tests
input = malloc(sizeof(int)*tests);
//test values
for(i=0; i<=tests-1; i++)
scanf("%d",&input[i]);
//finds max test value
i=0;
for (i = 0; i < tests; i++ )
{
if ( input[i] > max-1 )
max = input[i];
}
// calls nprime places value in n
nthprime = nprime(max);
primes = malloc(sizeof(int)*nthprime);
// calls sieve_sum
sieve_sum( primes, nthprime, tests, input);
//free memory
free(input);
free(primes);
return 0;
}
//finds Primes and their sum
void sieve_sum ( int *primes, int nthprime, int tests,int *input)
{
int i;
int j;
//fills in arrays with 1's
for(i=2; i<=nthprime; i++)
primes[i] = 1;
//replaces non primes with 0's
i=0;
for(i=2; i<=sqrt(nthprime); i++)
{
if(primes[i] == 1)
{
for(j=i; (i*j)<=(nthprime); j++)
primes[(i*j)] = 0;
}
}
//rewrites array with only primes
j=1;
i=0;
for(i=2; i<=nthprime; i++)
{
if(primes[i] == 1)
{
primes[j] = i;
j++;
}
}
//sums
i=0;
for ( i=1; i<=tests; i++ )
{
int sum=0;//sum of primes
j=0;
for(j=1; j<=input[i-1]; j++)
{
sum = primes[j] + sum;
}
printf("%d\n", sum );
}
return 0;
}
//finds the Nth number prime
int nprime (int max)
{
//aproximization of pi(n) (the nth prime) times 2 ensures correct allocation of memory
max = ceil( max*((log (max)) + log ((log (max)))))*2;
return (max);
}
示例输入文件:
20
1
2
3
4
5
6
7
8
9
10
10
9
8
7
6
5
4
3
2
1
示例输出应为:
2
5
10
17
28
41
58
77
100
129
129
100
77
58
41
28
17
10
5
2
答案 0 :(得分:4)
好的,所以我不会说太多,因为看起来这可能是一个家庭作业问题。
我最好的猜测是,很多人甚至不愿意看你的代码,因为它的耐心程度有点过于混乱。它不是不可挽救的,但如果它更清洁,你可能会得到更好的反应。
因此,首先,对您的代码进行一些批评性的评论,以帮助您清理它:它的评论不足以使您的意图在任何级别都清晰,包括该程序的总体目的是什么;它以不寻常的方式不一致地缩进和间隔;并且你选择的变量名留下了一些东西,由于缺少对变量声明的评论而加剧了这一点。
您应该使用类似的代码编译此代码(假设您的源文件名为sumprimes.c
):
gcc -std=c99 -pedantic -Wall -Wextra -o sumprimes sumprimes.c -lm
看看它产生的警告,它会提醒你一些,即使是相当轻微的问题。
我通过检查可以看到的主要问题是,您的程序肯定会出现段错误,因为您使用malloc()
分配的存储空间太小sizeof(int)
,您省略了
像splint这样的静态错误检查可以帮助您检测一些其他问题;但是,没有必要盲目地遵循它的所有建议:一旦你理解它们全部,你就可以决定要遵循哪些建议。
其他一些评论:
const int
或更传统的#define
)来表示其含义。 malloc()
的返回值不是NULL
,请检查scanf()
的返回值(如果使用它)是预期值等。scanf()
是一个糟糕的选择,因为它会以难以预测的方式改变stdin
的状态,除非输入完全符合预期,你永远不能依赖。如果你想读取整数,最好用stdin
将fgets()
上可用的内容读入缓冲区,然后使用strtol()
,因为你可以做更有效的错误 - 以这种方式检查和报告。malloc()
的回报。希望这有帮助。