标题:[求助]关于一道题的N个不同的解法!(有疑惑)
只看楼主
wzhings
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2007-1-16
 问题点数:0 回复次数:11 
[求助]关于一道题的N个不同的解法!(有疑惑)

题目描述:
哥德巴赫猜想:任意一个大于等于4的偶数都能表示为两个质数之和

输入:
有多组测试数据,每行一个小于1e7的并且大于2的偶数
以EOF标志结束程序。

输出:
对于每组测试,输出拆分的结果,有多组结果则都要输出
输出顺序按拆分的第一个数的大小从小到大输出


这是我前几天看到的一个题目,也见到了几个人的代码,但是有些疑问..
希望有人指点.

一.
#include<stdio.h>
#include<math.h>/*这个头函数,MS加了没有用啊!*/
int main()
{int prime(long n);
long i,j;
int n=1;
while(j!=0)
{ if(n==4)
{
printf("4=2+2\n");
continue;
}
printf("input the num to ceshi:");
scanf("%ld",&j);
for(i=3;i<=j/2;i+=2)
{if(prime(i)&&prime(j-i)&&j-i>1)/*-i>1这个条件好像没用的,只要前两项就好!*/
printf("%ld=%ld+%ld\n",j,i,j-i);
}
}
return 0;
}
int prime(long n)
{
int i,flag=1;
for(i=2;i<=n/2;i++)/*这个是求素数的算法吗?为啥不是sqrt(n)*/
{if(n%i==0)
flag=0;
}
return(flag);
}

二.
#include <stdio.h>

/**
n>=3 and n is odd.
*/
int isPrime(int n)
{
int k, upperBound=n/2;

for(k=3; k<=upperBound; k+=2)
{
upperBound=n/k;/* 这个语句没看懂是起啥作用的*/
if(n%k==0)
reurn 0;
}

return 1;
}

int main()
{
int n, k, nHalf;

while(scanf("%d", &n)!=EOF)
{
nHalf = n>>1;/*这个右移一位的作用?没看懂*/
for(k=3; k<=nHalf; k+=2)
{
if(isPrime(k)==1 && isPrime(n-k)==1)
{
printf("%d=%d+%d\n", n, k, n-k);
}
}
}

return 0;
}



[此贴子已经被作者于2007-10-20 21:36:23编辑过]

搜索更多相关主题的帖子: 解法 
2007-10-20 21:35
wzhings
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2007-1-16
得分:0 

这是我最初的代码...好像在算法上有问题..
因为我感觉上面的几种方法,都没有太按要求来做..(eg.1)每行一个小于1e7的并且大于2的偶数;2)有多组结果则都要输出
输出顺序按拆分的第一个数的大小从小到大输出

编译好像能行了..(在Dev C++上.但是不能运行啊!??)

#include <stdio.h>
#include <conio.h>
#include <math.h>
int prime(long int);
int main(void)
{
long int num[10];
int i=0;
int n,t;
printf("Please input numbers:\n");
while(1)
{
scanf("%d\n",&num[i]);
if(num[i]<=2&&num[i]>=1e7)
printf(" error\n");
else if (num[i]==EOF)
break;
else
i++;
}
for(n=0;n<=i;n++)
for(t=3;t<=num[i]/2;t+=2)
{
if(prime(t)&&prime(num[i]-t))
printf("%ld=%ld+%ld\n",num[i],t,num[i]-t);
}
getch();
return 0;
}

int prime (long int n)
{
int k,i;
k=(int)sqrt(n);
for(i=2;i<=k;i++)
if (n%i==0)
return 0;
else
return 1;
}


在我的眼里,这个世界是由0和1组成的!~
2007-10-20 21:40
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
得分:0 
>>1 等同于 /2
求素数的算法可以是n/2,只不过速度不如sqrt(n)

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2007-10-20 21:41
longerhe
Rank: 1
等 级:新手上路
帖 子:120
专家分:0
注 册:2006-10-10
得分:0 
2007-10-20 21:44
wzhings
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2007-1-16
得分:0 

再想说一下下...
1)
那个求素数的算法..是不是判断该数能不能被从3到sqrt(n)这个范围的数整除吧..(步长为2)..??


2)
关于EOF..
一直不知"以EOF结尾"是怎么表示,于是出现了 if(num=='EOF') break;这样的语句..
后来才知道是ctrl+Z....



我知道我又犯挺白痴的问题了...


在我的眼里,这个世界是由0和1组成的!~
2007-10-20 21:45
wzhings
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2007-1-16
得分:0 
以下是引用卧龙孔明在2007-10-20 21:41:15的发言:
>>1 等同于 /2
求素数的算法可以是n/2,只不过速度不如sqrt(n)


所谓的速度不如sqrt的,是不是因n/2要循环的次数多于sqrt的情况?


在我的眼里,这个世界是由0和1组成的!~
2007-10-20 21:47
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 
对头.

倚天照海花无数,流水高山心自知。
2007-10-20 21:48
wzhings
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2007-1-16
得分:0 

for(k=3; k<=upperBound; k+=2)
{
upperBound=n/k;/* 这个语句没看懂是起啥作用的*/
if(n%k==0)
reurn 0;



那上述语句中的upperBoun=n/k,又咋理解呢??


在我的眼里,这个世界是由0和1组成的!~
2007-10-20 21:49
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 
以下是引用wzhings在2007-10-20 21:45:19的发言:

再想说一下下...
1)
那个求素数的算法..是不是判断该数能不能被从3到sqrt(n)这个范围的数整除吧..(步长为2)..??


2)
关于EOF..
一直不知"以EOF结尾"是怎么表示,于是出现了 if(num=='EOF') break;这样的语句..
后来才知道是ctrl+Z....

EOF是-1
遇到扫描文件内容为空也这样返回,结束输入.

我知道我又犯挺白痴的问题了...


倚天照海花无数,流水高山心自知。
2007-10-20 21:49
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
得分:0 
因为只要是偶数除2外肯定不是质数,因此i+=2

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2007-10-21 11:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-179401-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.379619 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved