主题:第二界编程比赛试题
黄金风格
[专家分:4050] 发布于 2005-10-20 13:06:00
输入两个整数(要求100以内的自然数),若这两个整数之间存在自然数对,则将其中所有的自然数对输出,否则输出不存在的提示.所谓的自然数对是指两个自然数的和与差都是平方数.例如:17-8=9,17+8=25,那么17与8就是自然数对!
例如:输入:2 11
输出: 4 5
6 10
请大家按要求做题,一定要严密,贴上最优的代码!
由于本的能力有限,我想采取大家投票的方式取下届冠军.
请大家投自己最中意的程序编者!!
回复列表 (共72个回复)
61 楼
黄金风格 [专家分:4050] 发布于 2005-10-20 22:36:00
简单说两句,对于我出的题,在一定程度上是存在不严密性.
可我的本意是给广大的编者更大的自由空间,看编者的程序
是否能作出合理的各种输入判断以及其他的条件限制,以达到
程序的高可用性!
我也希望各位选手能尽力编出严密合理的程序,望选手谅解!
对参加比赛的个别选手的不当行为,我还是以为他们不是出于本意的
也希望这些选手出来给自己解释一下!.
这次试题的结贴时间为:2005.10.21号13点
另外我也根据个别选手的提议,想选个别选手与我共同评选这次试题.
评选时间定为21号13点,届时我将新开一贴,希望选手在此贴中写上自己认为最好的
选手及其程序,应附加评议.
这个项目是刚成立的,希望大家能鼎立支持,以后会根据具体的情况来增加题的难度和
实际应用性!!
再次希望届时选手积极参加评选活动,可以评选自己的程序!!
62 楼
PgiLvSny [专家分:240] 发布于 2005-10-20 22:37:00
恩,恩,而且cole的水平也是在是,水啊,cole你真的写过C语言的程序吗?在C语言里面^注意:^,是位运算符号,XOR!不是算幂的!
63 楼
黄金风格 [专家分:4050] 发布于 2005-10-20 23:14:00
个人认为:
编程比赛这个活动只是给广大的编程爱好者一个共同参与和交流的平台,通过活动而达到认识缺点,找到和学习优点的目的.
而本人认为像这样的活动一个星期举行一次最为合理!!
64 楼
iAkiak [专家分:8460] 发布于 2005-10-20 23:54:00
@cole
请用人类的方式交流,谢谢合作...
65 楼
lion72 [专家分:0] 发布于 2005-10-21 03:16:00
#include<stdio.h>
#include<math.h>
void main()
{
int num1,num2,temp;
int i,j;
int intTemp1,intTemp2;
char flag='n';
printf(" Please input first numbers (0~100):");
scanf("%d",&num1);
while(num1<1 || num1>100)
{
printf(" Please input first numbers again(0~100):");
scanf("%d",&num1);
}
printf(" Please input twice numbers (0~100):");
scanf("%d",&num2);
while(num1==num2 || num2<1 || num2>100)
{
printf(" Please input twice numbers again(0~100):");
scanf("%d",&num2);
}
if(num1>num2)
{
temp=num1;
num1=num2;
num2=temp;
}
for(i=num1;i<num2-1;i++)
{
for(j=i+1;j<num2;j++)
{
intTemp1=sqrt(i+j);
intTemp2=sqrt(j-i);
if(sqrt(i+j)-intTemp1==0 && sqrt(j-i)-intTemp2==0)
{
printf("%d\t%d\n",i,j);
flag='y';
}
}
}
if(flag=='n')
{
printf("Sorry,no answer...\n");
}
}
注:VC++ 6.0
66 楼
gaoshikao [专家分:0] 发布于 2005-10-21 03:33:00
#include <stdio.h>
#include <math.h>
int if_square(int m)
{
int gen=sqrt(m);
if(gen*gen==m)return(1);
return(0);
}
void find(int num1,int num2)
{
int temp;
int i,j;
if(num1==num2){printf("none\n");return;}
if(num1>num2){temp=num1;num1=num2;num2=temp;}
for(i=num1;i<num2;i++)
for(j=i+1;j<=num2;j++)
if(if_square(j-i)&&if_square(j+i))printf("%d %d\n",i,j);
}
void main()
{
int a,b;
while(scanf("%d %d",&a,&b)!=EOF)find(a,b);
}
67 楼
lsylsy [专家分:400] 发布于 2005-10-21 09:08:00
我觉得31楼的程序算法非常好,循环次数很少,输入1和99循环只有35次。我认为不好的地方把它加工了一下。
首先声明:要是本贴能入选的话,那也只能属于eastcowboy的,决不能归功于我lsylsy。
#include<stdio.h>
#include<math.h>
int main()
{ int i,j,a,b,min,max,lim,count=0;
printf("请输入0--100以内的两个整数:");
scanf("%d%d",&a,&b);
max=a,min=b;
if(a<b) max=b,min=a;
lim = (int)sqrt(max)+1;
if(min>0&&max<100)
{ for(a=min/2;a<lim;++a)
for(b=a+1;b<lim;++b)
{ i = 2*a*b;
j = a*a + b*b;
if(i<min || j>max) break;
printf("%d,%d\t",i,j);
++count;
}
printf("共找到%d组解。\n",count);
}
else printf("对不起!您输入的数据有误!\n");
}
68 楼
黄金风格 [专家分:4050] 发布于 2005-10-21 09:18:00
to:一楼
下面是我在出题的时候给出的例子.
例如:输入:2 11
输出: 4 5
6 10
2和2算不算自然数对呢?若是我认为2和2算自然数对的话,那我的输出也该有的,
既然我没写,显然我是认为它是不符合的!
69 楼
杀死进程 [专家分:510] 发布于 2005-10-21 10:04:00
#include "stdio.h"
#include "math.h"
int main()
{
int num1,num2,a[100],i,t,*p,*q,count=0;
printf("请输入两个整数(0<num<100):");
while(scanf("%d%d",&num1,&num2)==0) //判断是否输入数字
{
printf("请输入数字!\n");
return 1;
}
if(num1<=0 || num1>100 || num2<=0 || num2>=100)//判断输入数字的范围是否正确
{
printf("输入的数字超过规定范围!\n");
return 1;
}
if(num1>num2)
{
t=num1;num1=num2;num2=t;//让小数在前
}
for(i=0;i<100;i++)//初始化数组
a[i]=i+1;
p=a+num1;q=a+num1+1;//指针开始指向的位置
while(p<a+num2-2)
{
for(;q<a+num2;q++)
{
if(!(sqrt(*q-*p)-(int)(sqrt(*q-*p))
|| sqrt(*q+*p)-(int)(sqrt(*q+*p))))
{
printf("\t%d\t%d\n",*p,*q);
count++;
}
}
p++;//q每整个循环结束一次p指针加一个
q=p+1;//重新定位p指针,使它指向q的下一个数
}
printf("共找到%d组解!\n",count);
}
//希望大家能够给我提点建议啊!:)
70 楼
杀死进程 [专家分:510] 发布于 2005-10-21 10:24:00
31楼方法是不错
可是俺不大能够看明白.
能否再讲的仔细点啊
特别是你的循环范围部分!
谢啊:)
我来回复