这个是题目,没有找到答案:
题目内容:
我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。
现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
输入格式:
两个整数,第一个表示n,第二个表示m。
输出格式:
一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
输入样例:
2 4
输出样例:
15
这个是我的程序
#include<stdio.h>
int main(void)
{
int m,n;
printf("请输入两个正整数:\n");
scanf("%d %d", &m, &n);
//取得第m个质数的计算
int zhishu = 2;
int begin = zhishu;
int b;
int i = 0;
while ( i < m-1)
{
int a = 2;
while ( begin>a)
{
b = begin%a;if ( b == 0)
{
goto A; //该数为合数,跳出循环
}
a++;if ( begin == a)
{
i++;
break;
}
}
zhishu = begin;
A:
begin++;
}
printf("%d\n", zhishu); //测试输出第m个质数
if ( m == n)
{
printf("第%d个质数为%d\n", m, zhishu);
goto C;
}
i = 0; //重置变量i
int time = n - m;
int next = zhishu+1;
//累加从第m个质数开始至第n个质数
do
{
int a = 2;
while ( next > a)
{
b = next%a;if ( b == 0 )
{
goto B; //该数为合数,跳出循环
}
a++;if ( next == a)
{
i++;
printf("%d\n", next); //测试输出得到的下一个质数
zhishu = zhishu + next;
break;
}
}
B:
next++;
} while ( i < time);
printf("从第%d个质数到第%d个质数的和为%d\n", m, n, zhishu);
C:
return 0;
}
感觉我的程序有点过于繁琐了,而且还用了三个goto,所以比较不满意
求各位看看我的程序有什么改进的空间吗?
那个我感觉你代码太长了,应该不用那么复杂吧
下面是我的思路,有错的话可以指出来:
#include <stdio.h>
int f(int x)
{
int i;
for(i=2;i*i<=x;i++)
if(x%i==0) return 0; //能被整除说明不是素数
return 1;
}
int main()
{
int i,j,m,n,sum;
scanf("%d%d",&m,&n);
for(i=2,j=0,sum=0;;i++)
{
if(f(i)==1) //判断素数
{
j++; //判断是第几个素数
if(j>=m&&j<=n) sum+=i; //是第m到第n之间的素数就相加
if(j>n) break; //超过n就可以退出循环输出结果了
}
}
printf("%d\n",sum); //输出结果
return 0;
}