主题:第二界编程比赛试题
黄金风格
[专家分:4050] 发布于 2005-10-20 13:06:00
输入两个整数(要求100以内的自然数),若这两个整数之间存在自然数对,则将其中所有的自然数对输出,否则输出不存在的提示.所谓的自然数对是指两个自然数的和与差都是平方数.例如:17-8=9,17+8=25,那么17与8就是自然数对!
例如:输入:2 11
输出: 4 5
6 10
请大家按要求做题,一定要严密,贴上最优的代码!
由于本的能力有限,我想采取大家投票的方式取下届冠军.
请大家投自己最中意的程序编者!!
回复列表 (共72个回复)
21 楼
cole [专家分:960] 发布于 2005-10-20 14:27:00
#include<stdio.h>
#include<math.h>
main()
{int i,j,k,t;
k=t=0;
scanf("%d%d",&i,&j);
if((i>=0&&i<=100)&&(j>=0&&j<=100))
{k=j-i;t=j+i;
k=abs(k);
if(k==sqrt(k)^2&&t==sqrt(t)^2)
printf("%d %d\n",i,j);
}
else
printf("the error!");
}
22 楼
LO几又VE [专家分:14490] 发布于 2005-10-20 14:29:00
我也来凑凑热闹
#include <stdio.h>
int squareNum[30]; //200以内的平方数
int len; //200以内的平方数个数
int isSq(int num) //num是平方数返回1否则返回0
{
int i;
for(i = 0; i < len; i++)
if(squareNum[i] == num)
return 1;
return 0;
}
int main()
{
int i, j, temp;
int sma, big;
for(len = 0, i = 1; (j = i*i) < 200; i++) //初始化平方数表
squareNum[len++] = j; //j的介入是有意图的 -- 减少乘法运算
scanf("%d%d",&sma, &big);
if(sma > big)
{
temp = sma;
sma = big;
big = temp;
}
for(i = sma; i <= big; i++) //双层循环的循环设计作了优化
for(j = big; j >= sma; j--)
if(isSq(i+j) && isSq(j-i)) //判断数队的组合方法作了优化
{
printf("%4d%4d\n",i,j);
break; //break的介入是有意图的 -- 找到一组解进入下轮
}
return 0;
}
23 楼
PgiLvSny [专家分:240] 发布于 2005-10-20 14:30:00
to cole你是来踢馆子的吗?
呵呵,偶写了个笨笨的傻程序
#include <stdio.h>
#include <math.h>
int findfun(int n1, int n2, int i);
main()
{
int i, n1, n2;
scanf("%d", &n1);
scanf("%d", &n2);
i = 1;
findfun(n1, n2, i);
}
int findfun(n1, n2, i)
{
int j, n, ii;
ii = i * i;
if( n1 + ii > n2 )
return 0;
for(j = n1; j + ii <= n2; ){
n = (int)sqrt(j + j + ii);
if( n * n == j + j + ii)
printf("%d\t%d\n",j, j + ii);
j++;
}
i++;
findfun(n1, n2, i);
}
24 楼
cusa [专家分:180] 发布于 2005-10-20 14:32:00
[color=008000]#include <stdio.h>[/color]
[color=008000]#include <math.h>[/color]
[color=0000FF]int[/color] isPow(int in);
[color=0000FF]void[/color] main()
{
[color=0000FF]int[/color] m,n,i,j,tmp,flag = 0;
printf("enter two numbers 1~100:\n");
scanf("%d %d",&m,&n);
[color=0000FF]if[/color](m > n) {
tmp = m;
m = n;
n = tmp;
}
[color=0000FF]for[/color](i = m;i <= n;i++) {
[color=0000FF]for[/color](j = i+1;j <= n;j++) {
[color=0000FF]if[/color](isPow(i+j) == 0 && isPow(j-i) == 0) {
flag = 1;
printf("%d %d\n",i,j);
}
}
}
[color=0000FF]if[/color](flag == 0) printf("result not found!");
}
[color=0000FF]int[/color] isPow(int in) {
[color=0000FF]double[/color] result;
[color=0000FF]int[/color] tmp;
result = sqrt(in);
tmp = result;
[color=0000FF]return[/color](result-tmp > 0?1:0);
}
25 楼
探路者二号 [专家分:1170] 发布于 2005-10-20 14:32:00
到目前为止,编译试验后,此页之前的还没有一个人的C代码通过,C++的没有去试。
26 楼
cole [专家分:960] 发布于 2005-10-20 14:32:00
#include<stdio.h>
#include<math.h>
main()
{int i,j,k,t;
k=t=0;
scanf("%d%d",&i,&j);
if((i>=0&&i<=100)&&(j>=0&&j<=100))
{k=j-i;t=j+i;
k=abs(k);
if(k==sqrt(k)^2&&t==sqrt(t)^2)
printf("%d %d\n",i,j);
}
else
printf("the error!");
}
27 楼
iAkiak [专家分:8460] 发布于 2005-10-20 14:37:00
@探路者二号,25
你用的编译器是...?
28 楼
iAkiak [专家分:8460] 发布于 2005-10-20 14:42:00
@cole
不要再重复发贴了~浪费这点资源不算多,但大家都要翻来翻去就毁了不少时间。
btw. 有没有人来阻止cole?
29 楼
LO几又VE [专家分:14490] 发布于 2005-10-20 14:52:00
第22楼程序有点错误[不能加BREAK]
修正如下:
#include <stdio.h>
int squareNum[20]; //200以内的平方数
int len; //200以内的平方数个数
int isSq(int num) //num是平方数返回1否则返回0
{
int i;
for(i = 0; i < len; i++)
if(squareNum[i] == num)
return 1;
return 0;
}
int main()
{
int i, j, temp;
int sma, big;
for(len = 0, i = 1; (j = i*i) < 200; i++) //初始化平方数表
squareNum[len++] = j; //j的介入是有意图的 -- 减少乘法运算
scanf("%d%d",&sma, &big);
if(sma > big)
{
temp = sma;
sma = big;
big = temp;
}
for(i = sma; i <= big; i++) //双层循环的循环设计作了优化
for(j = big; j >= i; j--)
if(isSq(i+j) && isSq(j-i)) //判断数队的组合方法作了优化
printf("%4d%4d\n",i,j);
return 0;
}
//另:楼主如果是用的OJ提交的话只怕有点问题 因为输出格式可能与要求不符
30 楼
lsylsy [专家分:400] 发布于 2005-10-20 14:52:00
这是我的,比较符合题意,也能大大减少冗余的计算。来看一下:
#include "math.h"
main()
{ int a,b,c,i,j,k;
float d;
scanf("%d",&a);
scanf("%d",&b);
if(a>b) i=a,j=b;
else i=b,j=a;
if(i<100&&j>0)
while(i>j)
{ for(k=i-1;k>=j;k--)
{ c=i-k;
if(c==1||c==4||c==9||c==16||c==25||c==36||c==49||c==64||c==81)
{ d=sqrt(i+k);
if(d-floor(d)==0) printf("%2d;%2d\t",k,i);
}
}
i--;
}
else printf("请输入0—100之间的整数");
}
我来回复