一个枚举题解。

省流:一定要开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;
} 

注意了,b数组要清空,
long long 不要写
longlong

long long不要写long long是神马意思

莫得
long long 不要写
longlong
qwq

哦。