题目:质数之和
已知,第一个质数是2,第二个质数是3,第三个质数是5,第四个质数是7,第五个质数是11,第六个质数是13,第七个质数是17,输入两个不相等的正整数a和b,求出第a个质数到第b个质数当中所有质数和。a和b之间以空格间隔,其中a和b都小于200。
输入1:1 4 输出1:17
输入2:7 2 输出2:56
第一步:我们来分析题目
需要注意的要点有:
1.输入的a和b是“第几个质数”,这启发我们需要使用数组;
2.求质数和,或许需要循环相加;
3.观察输入输出2可以发现,a、b大小是不确定的!这就需要我们进行if判断两者之间的大小了。
第二步:梳理题目块
经过分析,我们的c语言程序需要这几个部分:
1.判断一个数字是否为质数
为了方便和直观起见,我另定义了一个函数isPrime来判断质数,方法是:对所有从2开始到这个数字之间的、能够被这个数字整除的数用count计数。当count==0时,说明这个数除了1和它本身外没有其他因数了,即质数,return它自己;若count!=0,说明它不是质数,return 0。
int isPrime(int x)
{
int i,count=0;
for(i=2 ; i<x ; i++)
{
if(x%i==0)
{
count++;
}
}
if(count==0)
{
return x;
}
else
{
return 0;
}
}
2.如果是质数,将这个质数的值赋给数组中的一个变量;如果不是,将这个数字加一以后再循环(发现这里是第一个循环)
int main()
{
int a[1000]={0},j,m;
int origin=2;
for(j=0 ; j<=1000 ; j++)
{
for(m=0 ; a[j]==0 ; m++)
{
if(isPrime(origin)==0)
{
origin++;
}
else
{
a[j] = origin;
origin++;
}
}
}
3.输入x,y,判断x,y大小之后分别赋给大数max和小数min,利用循环和数组进行求和
int x,y;
scanf("%d %d",&x,&y);
int sum=0;
int max,min;
if(x>y)
{
max = x;
min = y;
}
else
{
max = y;
min = x;
}
for(j=min-1 ; j<max ; j++)
{
sum += a[j];
}
printf("%d",sum);
return 0;
}
第三步:整合代码
#include<stdio.h>
int isPrime(int x)
{
int i,count=0;
for(i=2 ; i<x ; i++)
{
if(x%i==0)
{
count++;
}
if(count==0)
{
return x;
}
else
{
return 0;
}
}
int main()
{
int a[1000]={0},j,m;
int origin=2;
for(j=0 ; j<=1000 ; j++)
{
for(m=0 ; a[j]==0 ; m++)
{
if(isPrime(origin)==0)
{
origin++;
}
else
{
a[j] = origin;
origin++;
}
}
}
int x,y;
scanf("%d %d",&x,&y);
int sum=0;
int max,min;
if(x>y)
{
max = x;
min = y;
}
else
{
max = y;
min = x;
}
for(j=min-1 ; j<max ; j++)
{
sum += a[j];
}
printf("%d",sum);
return 0;
}