省流:一定要开longlong
题目描述:
请找出最大的满足以下条件的十位数:
这个十位数由0~9组成,且0~9各出现一次。
这个十位数是一个完全平方数。
一个十位数表示答案。
我们在调用函数和枚举算法之后会出现一个bug
#include<bits/stdc++.h>
#include<cmath>
using namespace std;
long long t;
long long ans = -1;
long long b[11];
bool f(long long x)
{
while(x != 0)
{
b[x%10]++;
x = x/10;
}
int flag = 1;
for(int i = 0; i<=9 ; i++)
{
if(b[i]!=1)
{
flag=0;
break;
}
}
if(flag == 1)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
for(longlong i = 31623;i<=99380;i++)
{
t = i * i;
if(f(t)) ans = max(ans,t);
}
cout << ans;
return 0;
}
该怎样改呢
把程序带进去,从主函数带进去
可以发现,在b数组地方有错误
此时桶数组在做累加,但是循环没有完毕,所以继续
可以得到一个很大的数字,继续传入,发现b数组没有清空,这是代码问题的关键
所以,我们要避免b数组保留前面的数组这一问题
清空后AC 代码如下
#include<bits/stdc++.h>
#include<cmath>
using namespace std;
long long t;
long long ans = -1;
long long b[11];
bool f(long long x)
{
//清空操作
for(int i = 0 ; i<= 10; i++)
{
b[i]=0;
}
while(x != 0)
{
b[x%10]++;
x = x/10;
}
int flag = 1;
for(int i = 0; i<=9 ; i++)
{
if(b[i]!=1)
{
flag=0;
break;
}
}
if(flag == 1)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
for(longlong i = 31623;i<=99380;i++)//这个地方有错误
{
t = i * i;
if(f(t)) ans = max(ans,t);
}
cout << ans;
return 0;
}