蓝桥杯 平方十位数

题目:平方十位数

由0~9这10个数字不重复、不遗漏,可以组成很多10位数字。
这其中也有很多恰好是平方数(是某个数的平方)。
比如:1026753849,就是其中最小的一个平方数。

请你找出其中最大的一个平方数是多少?

 

一看到这题目,首先我们大概的一个思路可能是这样子:

  1. 确定枚举变量和范围:枚举变量X,范围为[ 1026753849 , 9876543210 ]
  2. 判断该数是否恰好包含0~9十个数字
  3. 判断该数是否为完全平方数

  该算法当然正确,但是时间复杂度偏大。不过它的时间复杂度大概是1010到1011量级。因为首先枚举的范围就大约是1010,然后分离各位数字也有一个O(10)的复杂度。

 

通过改变枚举的变量进行枚举优化

优化后的思路:

  1. 确定枚举变量和范围:枚举变量Y,范围为[ sqrt(1026753849) , sqrt(9876543210) ]
  2. 计算 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

posted on 2018-06-11 16:42  Tuple  阅读(611)  评论(0编辑  收藏  举报

导航