poj2793 孙子问题,麻烦帮我看看到底错哪了,给几个变态的测试数据也可以
由于字数限制,题目我就不粘上来了,题目的网址:http://poj.grids.cn/practice/2793/下面是我的代码:#include<iostream>us...
由于字数限制,题目我就不粘上来了,题目的网址:
http://poj.grids.cn/practice/2793/
下面是我的代码:
#include<iostream>
using namespace std;
bool allIsEqual(int x[],int len1)//判断是否全部相等
{
for(int i=1;i<len1;i++)
{
if(x[0]!=x[i])
{
return false;
break;
}
}
return true;
}
int zdgys(int x,int y)//求最大公约数
{
while(x!=y)
{
if(x>y)
x-=y;
else if(x<y)
y-=x;
}
return x;
}
int len(int x[])//求大整数的位数
{
int i;
for(i=59;i>=0;i--)
{
if(x[i]!=0)
{
i++;
break;
}
}
return i;
}
void liplus(int a[],int b[])//高精度加法
{
for(int i=0;i<59;i++)
{
a[i]+=b[i];
if(a[i]>=10)
{
a[i]-=10;
a[i+1]++;
}
}
}
int mod(int m[],int n)//高精度取模
{
int result=0;
for(int i=59;i>=0;i--)
{
result=(result*10+m[i])%n;
}
return result;
}
void zxgbs(int x[],int y)//求最小公倍数
{
if(mod(x,y)==0)
{
return;
}
else
{
int b[60];
for(int j=0;j<60;j++)
b[j]=x[j];
for(int i=2;i<=y;i++)
{
liplus(x,b);
if(mod(x,y)==0)
return;
}
}
}
int main()
{
int num[60];
int n;
while(cin>>n)
{
if(n==0)
break;
bool lianglianghuzhi=true;
for(int i=0;i<n;i++)
{
cin>>num[i];
}
for(int i=0;i<n-1;i++)//判断是否两两互质
{
for(int j=i+1;j<n;j++)
{
if(zdgys(num[i],num[j])>1)
{
lianglianghuzhi=false;
break;
}
}
if(lianglianghuzhi==false)
break;
}
if(n==1)
cout<<1<<endl;
else if((lianglianghuzhi==false)&&(allIsEqual(num,n)==false))
cout<<"NO"<<endl;
else
{
int result[10][60]={};
if(allIsEqual(num,n)==true)
{
result[0][0]=1;
for(int i=1;i<n;i++)
result[i][0]=num[i];
}
else
{
for(int i=0;i<n;i++)//求出除去某个数剩下的数的最小公倍数,存在result[10][60]里
{
if(i==0)
{
if(num[i]==1)
{
result[i][0]=1;
continue;
}
result[i][0]=num[1]%10;
result[i][1]=num[1]/10;
}
else
{
if(num[i]==1)
{
result[i][0]=1;
continue;
}
result[i][0]=num[0]%10;
result[i][1]=num[0]/10;
}
for(int j=0;j<n;j++)
{
if(j==i)
continue;
zxgbs(result[i],num[j]);
}
}
for(int i=0;i<n;i++)//求出结果
{
int tmp1[60];
for(int k=0;k<59;k++)
tmp1[k]=result[i][k];
while(1)
{
if(mod(result[i],num[i])==1||num[i]==1)
break;
liplus(result[i],tmp1);
}
}
}
for(int i=0;i<n-1;i++)//输出
{
int l=len(result[i]);
for(int j=l-1;j>=0;j--)
cout<<result[i][j];
cout<<" ";
}
int l=len(result[n-1]);
for(int j=l-1;j>=0;j--)
cout<<result[n-1][j];
cout<<endl;
}
}
return 0;
}
交上去老是Wrong Anser,麻烦各位大牛帮忙看看,给几组我这个代码不能得出正确结果的测试数据也可以,给AC代码也可以,大恩不言谢!
以下是我的几组测试数据以及结果:
3 3 5 7
70 21 15
3 5 5 5
1 5 5
5 43 45 46 49 41
166345200 151004476 3887415 14597640 21807450
4 2 4 13 31
NO
5 2 2 2 3 5
NO
4 2 2 3 3
NO
0
请按任意键继续. . .
但貌似这几组测试数据都没发现哪里错了…… 展开
http://poj.grids.cn/practice/2793/
下面是我的代码:
#include<iostream>
using namespace std;
bool allIsEqual(int x[],int len1)//判断是否全部相等
{
for(int i=1;i<len1;i++)
{
if(x[0]!=x[i])
{
return false;
break;
}
}
return true;
}
int zdgys(int x,int y)//求最大公约数
{
while(x!=y)
{
if(x>y)
x-=y;
else if(x<y)
y-=x;
}
return x;
}
int len(int x[])//求大整数的位数
{
int i;
for(i=59;i>=0;i--)
{
if(x[i]!=0)
{
i++;
break;
}
}
return i;
}
void liplus(int a[],int b[])//高精度加法
{
for(int i=0;i<59;i++)
{
a[i]+=b[i];
if(a[i]>=10)
{
a[i]-=10;
a[i+1]++;
}
}
}
int mod(int m[],int n)//高精度取模
{
int result=0;
for(int i=59;i>=0;i--)
{
result=(result*10+m[i])%n;
}
return result;
}
void zxgbs(int x[],int y)//求最小公倍数
{
if(mod(x,y)==0)
{
return;
}
else
{
int b[60];
for(int j=0;j<60;j++)
b[j]=x[j];
for(int i=2;i<=y;i++)
{
liplus(x,b);
if(mod(x,y)==0)
return;
}
}
}
int main()
{
int num[60];
int n;
while(cin>>n)
{
if(n==0)
break;
bool lianglianghuzhi=true;
for(int i=0;i<n;i++)
{
cin>>num[i];
}
for(int i=0;i<n-1;i++)//判断是否两两互质
{
for(int j=i+1;j<n;j++)
{
if(zdgys(num[i],num[j])>1)
{
lianglianghuzhi=false;
break;
}
}
if(lianglianghuzhi==false)
break;
}
if(n==1)
cout<<1<<endl;
else if((lianglianghuzhi==false)&&(allIsEqual(num,n)==false))
cout<<"NO"<<endl;
else
{
int result[10][60]={};
if(allIsEqual(num,n)==true)
{
result[0][0]=1;
for(int i=1;i<n;i++)
result[i][0]=num[i];
}
else
{
for(int i=0;i<n;i++)//求出除去某个数剩下的数的最小公倍数,存在result[10][60]里
{
if(i==0)
{
if(num[i]==1)
{
result[i][0]=1;
continue;
}
result[i][0]=num[1]%10;
result[i][1]=num[1]/10;
}
else
{
if(num[i]==1)
{
result[i][0]=1;
continue;
}
result[i][0]=num[0]%10;
result[i][1]=num[0]/10;
}
for(int j=0;j<n;j++)
{
if(j==i)
continue;
zxgbs(result[i],num[j]);
}
}
for(int i=0;i<n;i++)//求出结果
{
int tmp1[60];
for(int k=0;k<59;k++)
tmp1[k]=result[i][k];
while(1)
{
if(mod(result[i],num[i])==1||num[i]==1)
break;
liplus(result[i],tmp1);
}
}
}
for(int i=0;i<n-1;i++)//输出
{
int l=len(result[i]);
for(int j=l-1;j>=0;j--)
cout<<result[i][j];
cout<<" ";
}
int l=len(result[n-1]);
for(int j=l-1;j>=0;j--)
cout<<result[n-1][j];
cout<<endl;
}
}
return 0;
}
交上去老是Wrong Anser,麻烦各位大牛帮忙看看,给几组我这个代码不能得出正确结果的测试数据也可以,给AC代码也可以,大恩不言谢!
以下是我的几组测试数据以及结果:
3 3 5 7
70 21 15
3 5 5 5
1 5 5
5 43 45 46 49 41
166345200 151004476 3887415 14597640 21807450
4 2 4 13 31
NO
5 2 2 2 3 5
NO
4 2 2 3 3
NO
0
请按任意键继续. . .
但貌似这几组测试数据都没发现哪里错了…… 展开
3个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
您可能需要的服务
百度律临官方认证律师咨询
平均3分钟响应
|
问题解决率99%
|
24小时在线
立即免费咨询律师
13152人正在获得一对一解答
重庆晨曦微光6分钟前提交了问题
重庆晨曦微光6分钟前提交了问题
南昌湖上倒影2分钟前提交了问题