扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
我的程序不行么,我回答过你一次了
创新互联专注于奉新企业网站建设,成都响应式网站建设公司,商城系统网站开发。奉新网站建设公司,为奉新等地区提供建站服务。全流程按需搭建网站,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务
#include stdio.h
int is_prime(int n)
{
int i;
for(i = 2; i n ; i++)
{
if(n % i == 0)
break;
}
if(n == i)
return 1;
else
return 0;
}
int main(void)
{
int M;
int i,j;
int flag = 0;
scanf("%d",M);
for(i = M/2; i M; i++)
{
for(j = M/2;j 1; j-- )
if((is_prime(i)is_prime(j)) ((i+j) == M))
{
printf("%d %d\n",j,i);
flag = 1;
break;
}
if(flag == 1)
break;
}
return 0;
}
德国数学家哥德巴赫(Goldbach)在1725年写给欧拉(Euler)的信中提出了以下猜想:任何大于2的偶数,均可表示为两个素数之和(俗称为1+1)。近三个世纪了,这一猜想既未被证明,也未被推翻(即未找到反例)。
分析:
要将整数分解成两部分,然后判断分解出的两个整数是否都为素数。如是,则输出;否则,重新分解、判断。
编写一个程序,在有限范围内(例如4~2000)验证哥德巴赫猜想成立。请注意:这只是有限的验证,不能作为对哥德巴赫猜想的证明。
程序如下:
#include "stdio.h"
#include "math.h"
main( )
{ int fflag(int i);
int i,n;
for(i=4; i=2000; i+=2)
{for(n=2;n if(fflag(n)) /*分别判断两个整数是否均为素数*/
if(fflag(i-n))
{printf("%d=%d+%d\n",i,n,i-n); /*如均为素数则输出*/
break;
}
if(n==i)printf("error %d\n",i);
}
}
int fflag(int i) /*判断整数是否为素数*/
{ int j;
if(i=1) return(0);
if(i==1) return(1);
if(!(i%2)) return(0); /*if no, return 0*/
for(j=3;j=(int)(sqrt((double)i)+1);j+=2)
if(!(i%j)) return(0);
return(1); /*if yes, return 1*/
}
#include
void main( )
{
int i, j, k, IsPrime;
for(i = 4; i = 100; i += 2) /*偶数i从4到100*/
{
for(j = 2; j = i / 2; j++) /* 将j从2到i/2进行测试 */
{
for(k = 2, IsPrime = 1; (k = j / 2) IsPrime; k++) /*判断j是否为素数*/
if(j % k == 0) IsPrime = 0;
if(IsPrime) { /*如果j是素数*/
for(k = 2, IsPrime = 1; (k = (i - j) / 2) IsPrime; k++) /*判断i-j是否是素数*/
if((i - j) % k == 0) IsPrime = 0;
if(IsPrime) /*如果i-j也是素数,则找到了i的一个解,将其输出,下一个偶数i*/
{
printf("%d = %d + %d\t", i, j, i - j);
break;
}
}
}
}
}
除了printf与main外,没有用到其他任何的函数,楼主不妨试一试。
首先更正一下,哥德巴赫猜想是不小于6的偶数……符合你要求的程序如下,可以运行:
#includestdio.h
int isprime(int n)/*判断n是否为素数的函数*/
{
int j,x;
for(j=2;jn;j++)
if(n%j==0)
{
x=0;
break;
}else
x=1;
return(x);
}
main()
{
int n,i;
printf("请输入一个不小于6的偶数:\n");
scanf("%d",n);
while(n6||n%2!=0)
{
printf("您的输入有误,请重新输入:\n");
scanf("%d",n);
}
for(i=3;i(n/2);i++)
{
if(isprime(i)!=0)
if(isprime(n-i)!=0)
printf("%d可以写成%d与%d之和。\n",n,i,n-i);
}
}
哇,这个问题已经被搁置4年了,我看到了就来答一下吧(虽然可能已经没人感兴趣了)
首先,听说哥德巴赫猜想已经被证明了,也就是不存在不成立的情况了,(可点击链接
)
然后是问题本身,如果真有不符合的,可以在for(m=3;m=k-3;m++)这个循环后面判断一下是否是循环到了尽头,即是否mk-3,如果到了尽头都不符合,那就可以输出不符合了;
至于全部不符合的情况,由于前面已经逐项输出,已经打印的事实已经无法改变,因此就无法只输出说该范围内所有数都不符合,若真的要达到那种效果,可以把你要printf的先用fprintf函数打到临时创建的文件里,然后最后根据判断不符合的个数决定全部打印还是打印一条。总之是用文件读写是一种方法。
最后呢,如果说还要改进的话,有两点可以改进下——1,我从老师那里听来判断素数的条件可以再缩小一点,也就是文中的y=x/2,可以改为 y=sqrt(x)【因为sqrt(x)的平方=x,如果小于y的整数不符合,那么大于y的数也不会符合】;
2,类似于第一点 for(m=3;m=k-3;m++)条件可改为m=k/2;【理由同1】。
呃,就是这样了,不过4年前应该提问者是大一现在应该毕业了吧~哈哈
您好,#include "stdio.h"
#include "math.h"//是否是素数
int IsPrime(int n)
{
int i;
for (i=2;in/2;i++)
{
if(n%i==0)
return 0;
}
return 1;
}void Output(int n)
{
int i;
for(i = 2; i=n/2;++i)
{
if(IsPrime(i) IsPrime(n-i))
{
printf("%d=%d+%d\n",n,i,n-i);
break;
}
}
}
void main()
{
Output(107000);
printf("\n");
} IsPrime(int n)和Output(int n) 都是自定义函数,是写的人根据函数内容自己编写的。他们最后都可以在主函数中调用,其中if(IsPrime(i) IsPrime(n-i))和Output(107000) 都是他们的调用。if(IsPrime(i) IsPrime(n-i))的意思是:如果这个数i以及(n-i)都为素数,那么执行下面操作。(当IsPrime(i)为1时是素数,为0时为合数)Output(107000) 的结果为:printf("%d=%d+%d\n",n,i,n-i);即:输出107000这个数符合哥德巴赫猜想,他是哪两个质数的和。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流