这题真是把我快坑死了,查了一上午最后发现还是越界的问题。
因为输入的数和乘积都可能会很大,一旦超过int范围之后就回出错,好几遍WA就是这么产生的。让我不禁想起了为什么二分查找要写成mid=low+(high-low)/2而不是mid=(low+high)/2。因为后一种写法编译器计算low+high可能会出现整数溢出,导致结果不对。这里道理也是一样的,所以计算时,数字都要对1000取余才行。
#include<iostream>
#include<cmath>
#include<stdio.h>
using namespace std;
int main()
{
int s;
cin>>s;
int result[100];
int k=0;
while(s!=0)
{
int a[1000]={0};
for(int i=1;;i++)
{
int tmp=1;
int flag=0;
for(int j=0;j<i;j++){
if(tmp*s>=1000)flag=1;
tmp=(tmp*(s%1000))%1000;
}
if(flag==1&&a[tmp]==0)
{
a[tmp]=i;
}
else if(flag==1&&a[tmp]!=0)
{
result[k++]=a[tmp]+i;
break;
}
}
cin>>s;
}
for(int i=0;i<k;i++){
cout<<result[i]<<endl;
}
return 0;
}
我就是漏了s%1000才一直WA,切记,数字很大的情况,感觉很多题都是因为这一点才WA,笔试的时候很多公司也会考察这点。