蓝桥杯 平方十位数
题目:平方十位数
由0~9这10个数字不重复、不遗漏,可以组成很多10位数字。
这其中也有很多恰好是平方数(是某个数的平方)。
比如:1026753849,就是其中最小的一个平方数。
请你找出其中最大的一个平方数是多少?
一看到这题目,首先我们大概的一个思路可能是这样子:
- 确定枚举变量和范围:枚举变量X,范围为[ 1026753849 , 9876543210 ]
- 判断该数是否恰好包含0~9十个数字
- 判断该数是否为完全平方数
该算法当然正确,但是时间复杂度偏大。不过它的时间复杂度大概是1010到1011量级。因为首先枚举的范围就大约是1010,然后分离各位数字也有一个O(10)的复杂度。
通过改变枚举的变量进行枚举优化
优化后的思路:
- 确定枚举变量和范围:枚举变量Y,范围为[ sqrt(1026753849) , sqrt(9876543210) ]
- 计算 X = Y * Y,并判断 X 是否恰好包含0~9十个数字
该算法的时间复杂度就比之前的低很多了,而且省去了检查 X 是否为完全平方数的步骤
优化后代码如下:
1 #include <iostream> 2 #include <set> 3 #include <math.h>> 4 using namespace std; 5 6 //判断是否包含 0 ~ 9 7 bool contains0_9(long long x) 8 { 9 set<long long> s; //set特点:去重 10 11 if(x == 0) 12 return false; 13 while(x) 14 { 15 int d = x % 10; 16 s.insert(d); 17 x /= 10; 18 } 19 return s.size() == 10; 20 } 21 22 int main() 23 { 24 long long i; 25 26 for(i = sqrt(9876543210); i >= sqrt(1026753849); i -- ) 27 { 28 if(contains0_9(i * i)) 29 { 30 cout << i * i; 31 break; 32 } 33 } 34 35 return 0; 36 }
答案:9814072356
以上总结仅供参考,若有不对之处,敬请谅解。
未经本人同意,不得转载,谢谢合作!