主题:第二界编程比赛试题
黄金风格
[专家分:4050] 发布于 2005-10-20 13:06:00
输入两个整数(要求100以内的自然数),若这两个整数之间存在自然数对,则将其中所有的自然数对输出,否则输出不存在的提示.所谓的自然数对是指两个自然数的和与差都是平方数.例如:17-8=9,17+8=25,那么17与8就是自然数对!
例如:输入:2 11
输出: 4 5
6 10
请大家按要求做题,一定要严密,贴上最优的代码!
由于本的能力有限,我想采取大家投票的方式取下届冠军.
请大家投自己最中意的程序编者!!
回复列表 (共72个回复)
沙发
whyhappy [专家分:1050] 发布于 2005-10-20 13:09:00
出来了!~~~~
(相关的判断如否输入是整数以及整数是否是在1-100之间等异常处理没有写就省了...)
#include<iostream>
#include<cmath>
using namespace std;
bool square(int n) //判断是否为平方数
{
int x=sqrt(n);
if(n==x*x) //如果能够相等就是平方数
return true;
return false;
}
int main()
{
int x,y,temp,n=0; //n用来判断是否有解.
cout<<"enter two numbers in 1 to 100: ";
cin>>x>>y;
if(x>y) {temp=x;x=y;y=temp;} //小的存在x,这样比较好循环
for(int i=x;i<=y;i++)
for(int j=i+1;j<=y;j++)
if(square(j-i)&&square(i+j))
{
cout<<i<<" "<<j<<endl;
n++;
}
if(!n)
cout<<"no this number.."<<endl;
return 0;
}
板凳
lt1234 [专家分:470] 发布于 2005-10-20 13:10:00
每个人都可以参加吗?
3 楼
yimi329 [专家分:50] 发布于 2005-10-20 13:11:00
我正在写呢,支持
两个相同的数不能算是自然数对吧!!!
否则楼主的答案就应该是:
2 2
8 8
4 5
6 10
了。
以上仅是我个人的看法。
4 楼
yexin218 [专家分:4070] 发布于 2005-10-20 13:18:00
may i hava a chance?
aha, i will do my best!
here it is:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int isSame(int twoNumbers){
int intValue;
double doubleValue;
doubleValue = sqrt(twoNumbers);
intValue = doubleValue;
return (doubleValue-intValue>0?1:0);
}
void main(){
int a,b,i,j;
int counter = 0;
int tempValue;
printf("Please enter two numbers between 1 and 100\n");
scanf("a=%d,b=%d",&a,&b);
if(a>b){
tempValue = a;
a=b;
b=tempValue;
}
for(i = a;i <= b;i++) {
for(j = i+1;j <= b;j++) {
if(isSame(j-i) ==0&& isSame(i+j) == 0 ) {
counter++;
printf("%d %d\n",i,j);
}
}
}
printf("There are total %d pairs!",counter);
if(counter==0) printf("Sorry,nothing found");
system("pause");
return 0;
}
5 楼
yimi329 [专家分:50] 发布于 2005-10-20 13:19:00
我用的是VC++
#include <stdio.h>
#include<math.h>
main()
{
int i,j,n1,n2,n=1;
printf("Input 2 numbers(1~100):");
scanf("%d%d",&n1,&n2);
for(;n1<1||n1>100||n2<1||n2>100;scanf("%d%d",&n1,&n2))
printf("Input wrong! Input agagin(1~100):\n");
if(n1>n2){i=n1;n1=n2;n2=i;}
for(i=n1;i<n2;i++)
for(j=i+1;j<+n2;j++)
if(sqrt(i+j)==abs(sqrt(i+j))&&sqrt(j-i)==abs(sqrt(j-i)))
{printf("\n%d %d",i,j);n=0;}
if(n)printf("\n No answer!\n");
}
6 楼
iAkiak [专家分:8460] 发布于 2005-10-20 13:33:00
#include <stdio.h>
#include <stdlib.h>
/* 15的平方已经超过200了 */
#define N 14
int p[N];
int pair[N*7][2];
int cmp(const void *a, const void *b)
{
const int *pa = (const int *)a;
const int *pb = (const int *)b;
if (pa[0] == pb[0])
return pa[1] - pb[1];
return pa[0] - pb[0];
}
int main()
{
int i, j ,t, a, b;
for (i = 1; i < N+1; i++) /* 1..N的平方 */
{
p[i-1] = i * i;
}
for (t = 0, i = 0; i < N; i++)
{
for (j = i + 1; j < N; j++)
{
if ((p[j]^p[i]) & 1) /* 必须同奇偶性 */
continue;
pair[t][0] = (p[j]+p[i]) / 2;
if (pair[t][0] < 100) /* a,b都不大于100 */
{
pair[t++][1] = (p[j]-p[i]) / 2;
}
}
}
qsort(pair, t, sizeof(int) * 2, cmp); /*排序,便于后面提早结束,不过这里只求一次,所以不做预处理排序更好... */
if (scanf("%d%d", &a, &b) != 2) /* 如果题目是要求n组输入,那么前面的排序是要的 */
return 0;
if (a > b) i = a, a = b, b = i; /* 保证a<=b,a,b就是左右界了 */
for (i = 0; i < t && pair[i][0] < a; i++) /* 按第一个数找到第一个满足条件的数对 */
;
for (j = 0; i < t && pair[i][0] <= b; i++) /* 如果第一个数都不满足,那么就不必看第二个数了 */
{
if (pair[i][1] <= b && pair[i][1] >= a) /* 第二个数字也要满足条件 */
{
printf("%d %d\n", pair[i][1], pair[i][0]);
j++;
}
}
j || printf("no\n"); /* 如果无解,j=0输出no */
return 0;
}
7 楼
yimi329 [专家分:50] 发布于 2005-10-20 13:35:00
这次加了注释哦。
我用的是VC++:
#include <stdio.h>
#include<math.h>
main()
{
int i,j,n1,n2,n=1;//n为1表示无解,为0表示有解
printf("Input 2 numbers(1~100):");
scanf("%d%d",&n1,&n2);
for(;n1<1||n1>100||n2<1||n2>100;scanf("%d%d",&n1,&n2))//提示错误的输入
printf("Input wrong! Input agagin(1~100):\n");
if(n1>n2){i=n1;n1=n2;n2=i;}//保证输入的数据是从小到大排列
for(i=n1;i<n2;i++)
for(j=i+1;j<+n2;j++)
if(sqrt(i+j)==abs(sqrt(i+j))&&sqrt(j-i)==abs(sqrt(j-i)))
{printf("\n%d %d",i,j);n=0;}
if(n)printf("\n No answer!\n");//结果判断
}
8 楼
yimi329 [专家分:50] 发布于 2005-10-20 13:39:00
呵呵,我没时间了,要上课了。
对自己很有信心,先投自己一票,没什么意见吧?!
9 楼
udngbb [专家分:0] 发布于 2005-10-20 13:42:00
我用的是VC++
#include <stdio.h>
#include<math.h>
void main()
{
int a,b,s,f,l;
printf("Input two integrals:");
scanf("%d%d",&a,&b);
s=(a+b);
f=(a-b);
//k=(b+a);
l=(b-a);
if((a>1&&a<100)&&(b>1&&b<100))
{
if(sqrt(s)!=0&&s>=0)
printf("%d,",s);
if(sqrt(f)!=0&&s>=0)
printf("%d,",f);
//if(sqrt(k)!=0&&s>=0)
//printf("%d,",k);
if(sqrt(l)!=0&&s>=0)
printf("%d,",l);
}
}
我是个初学者:)写的可能有点浅请大家谅解,我就是来学习的,希望大家能给点指点。呵呵估计肯定有错的地方,请大家帮我提出来,,谢谢:)
呵呵再三修改后应该是没问题了。已经调试过去了。
10 楼
onasp [专家分:5600] 发布于 2005-10-20 13:45:00
#include <iostream.h>
bool sum(int m, int n);
void max(int &m, int &n);
void main()
{
bool s=false;
int m, n;
do{
cout << "please input two numbers(1~100)." << endl;
cin >> m>> n;
}while(m<=0||m>100||n<=0||n>100);
max(m,n);
for (int i=n; i<m; i++)
for (int j=i+1; j<m+1; j++)
if (sum(j,i))
{
cout << i << " " << j << endl;
s=true;
}
if (!s) cout << n << "~" << m << " no anwser!" << endl;
}
void max(int &m, int &n)
{
int temp;
if (m<n)
{
temp = m;
m = n;
n = temp;
}
}
bool sum(int m, int n)
{
bool k1=false,k2=false;
int s[]={1,4,9,16,25,36,49,64,81,100,121,144,169,196};
//max(m,n);
for (int i=0;i<14; i++)
if ((m-n)==s[i]) {k1=true;break;}
for (int j=0;j<14; j++)
if ((m+n)==s[j]) {k2=true;break;}
if(k1&&k2) return true;
return false;
}
我来回复