A
A. 平方十位数
由0~9这10个数字不重复、不遗漏,可以组成很多10位数字。
这其中也有很多恰好是平方数(是某个数的平方)。
比如:1026753849,就是其中最小的一个平方数。
请你找出其中最大的一个平方数是多少?
注意:你需要提交的是一个10位数字,不要填写任何多余内容。
分析
暴力枚举判断。
答案:9814072356
思路:
本题可以暴力枚举:
枚举范围可以确定为:[1026753849,9999999999],判断区间内每一个数是否包含0~9这九个数字;
这样的枚举变量范围太大,可以改变枚举变量——枚举平方数的平方根;
可以确定平方根枚举范围为:[30000,100000],平方后判断是否包含0~9这九个数字。
判断平方数是否包含0~9的方法:
设置数组a[10](初始化为0),每次取平方数的个位数d,判断a[d]是否等于1,等于1说明之前存在数d,立即返回0;
否则将a[d]=1;若平方数有机会小于0(即10位数字都没有重复),则可以返回1;
并且本题需要注意的是,不能大意用int类型,因为会超出数据类型的数据范围。
代码:
#include <stdio.h> int judge(long long i) { int a[10]={0}; int j; int ans = 0; while(i!=0) { j=i%10; if(a[j]==1) return 0; a[j]=1; ans++; i/=10; } if(ans==10) return 1; return 0; } int main () { long long i; long long max = 0; for(i=30000; i<=100000; i++) { if(judge(i*i) == 1) { if(i*i > max) { max = i*i; } } } printf("%lld",max); return 0; }
CODE2
#include <iostream> #include <cstdio> #include <cmath> using namespace std; typedef long long ll; bool check(ll x) { int num[10] = { 0 }; while (x) { if (num[x % 10]) return false; num[x % 10]++; x /= 10; } return true; } int main() { ll t1 = sqrt(9876543210); // 组成十位最大的 ll t2 = sqrt(1023456789); // 组成十位最小的 for (ll i = t1; i >= t2; i--) { if (check(i * i)) { cout << i * i << endl; break; } } return 0; }