題目:質數之和 已知,第一個質數是2,第二個質數是3,第三個質數是5,第四個質數是7,第五個質數是11,第六個質數是13,第七個質數是17,輸入兩個不相等的正整數a和b,求出第a個質數到第b個質數當中所有質數和。a和b之間以空格間隔,其中a和b都小於200。 輸入1:1 4 輸出1:17 輸入2:7 ...
題目:質數之和
已知,第一個質數是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;
}