蓝桥杯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 }
我们不会停下探寻明天的脚步

浙公网安备 33010602011771号