蓝桥杯2013-省赛-C/C++-A组2题

题目
题目标题: 排它平方数

    小明正看着 203879 这个数字发呆。

    原来,203879 * 203879 = 41566646641

    这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。

    具有这样特点的6位数还有一个,请你找出它!

    再归纳一下筛选要求:
     1. 6位正整数
     2. 每个数位上的数字不同
     3. 其平方数的每个数位不含原数字的任何组成数位

答案是一个6位的正整数。

请通过浏览器提交答案。
注意:只提交另一6位数,题中已经给出的这个不要提交。
注意:不要书写其它的内容(比如:说明性的文字)。

代码

 

 1 /*2013 蓝桥-省-A-2 */
 2 #include<iostream>
 3 #include<set>
 4 #define ll long long
 5 using namespace std;
 6 ll fast_mul(ll a,ll b){
 7     ll ans=0;
 8     while(a!=0){
 9         //cout<<":"<<b<<endl; 
10         if(a&1) ans+=b; 
11         b+=b;
12         a>>=1;
13     }
14     return ans;
15 }
16 int main(){
17     ll n=100000;
18     ll rn,rm;
19     set<int> s_n;
20     set<int> s_m;
21     int len_n=0,len_m=0,len_nm=0;
22     while(n<1000000){
23         rn=n;
24         s_n.clear();
25         s_m.clear();
26         while(rn){
27             s_n.insert(rn%10);
28             rn/=10;
29         }
30         if(s_n.size()!=6){
31             n++;
32             continue;
33         }
34         ll mul_n=fast_mul(n,n);
35         //cout<<mul_n<<endl;
36         rm=mul_n;
37         len_n=s_n.size();
38         while(rm){
39             s_n.insert(rm%10);
40             s_m.insert(rm%10);
41             rm/=10;
42         }
43         len_nm=s_n.size();
44         len_m=s_m.size();
45         if(len_n+len_m==len_nm){
46             cout<<n<<" "<<mul_n<<endl;
47             /*
48             203879 41566646641
49             639172 408540845584
50             */
51         }
52         n++;
53     }
54     
55 } 

 

 

 

posted @ 2020-02-26 22:47  Mem_Ocean  阅读(195)  评论(0)    收藏  举报