[蓝桥杯]排它平方数

题目标题: 排它平方数


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


    原来,203879 * 203879 = 41566646641


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


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


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


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


请通过浏览器提交答案。
注意:只提交另一6位数,题中已经给出的这个不要提交。

注意:不要书写其它的内容(比如:说明性的文字)。

 

我的做法 回溯构造6位正整数 + 大整数乘法

答案是这几个数:

 

与 http://blog.csdn.net/on_way_/article/details/8894534 此博客中的答案不同.

但此文中 有答案 : 346789 而 346789* 346789 = 120262610521 发现结果和原乘数中都含有6,不合题意.

附代码,望指正:

  1 #include <stdlib.h>  
  2 #include <string.h>  
  3   
  4 int start[] = {1,0};  
  5 using namespace std;  
  6 unsigned long a;  
  7 char lNum[10];  
  8 char lRes[20];  
  9 int numLength,ResLength;  
 10 void mutiply();  
 11 int MyCompare(const void* a,const void* b)  
 12 {  
 13     return (int)(*(char*)a-*(char*)b);  
 14 }  
 15 void convert()  
 16 {  
 17     for (unsigned long t=a;t;t/=10)  
 18     {  
 19         lNum[numLength++] = t%10;   
 20     }  
 21     mutiply();  
 22 }  
 23 void mutiply()  
 24 {  
 25     int i,j,k=0,q=0;  
 26     for (i=0;i<numLength;i++)  
 27     {  
 28           
 29         for (j=0;j<numLength;j++)  
 30         {  
 31             lRes[k++] += lNum[i]*lNum[j];  
 32             if (lRes[k-1]>=10)  
 33             {  
 34   
 35                 lRes[k] += lRes[k-1]/10;  
 36                 lRes[k-1]=lRes[k-1]%10;  
 37                 //lRes[k-1] /= 10;  
 38             }  
 39         }  
 40         if (k>ResLength)  
 41         {  
 42             ResLength = k;  
 43         }  
 44         k=i+1;  
 45     }  
 46   
 47   
 48 }  
 49 bool check(int n)  
 50 {  
 51     int i,j;  
 52     convert();  
 53   
 54   
 55       
 56     for (i=0;i<numLength;i++)  
 57     {  
 58         for (j=0;j<ResLength;j++)  
 59         {  
 60             if (lNum[i]==lRes[j])  
 61             {  
 62                 return false;  
 63             }  
 64         }  
 65     }  
 66     return true;  
 67   
 68 }  
 69 bool unique(int n,int l)  
 70 {  
 71     char szNum[10];  
 72     itoa(n,szNum,10);  
 73   
 74     qsort(szNum,l,sizeof(char),MyCompare);  
 75     for (int i=0;i<l;i++)  
 76     {  
 77         if (szNum[i]==szNum[i+1])  
 78         {  
 79             return false;  
 80         }  
 81     }  
 82     return true;  
 83 }  
 84   
 85 void rescurtive(int k)  
 86 {  
 87     int i,j;  
 88     if (k>=6 )  
 89     {  
 90         if (check(a))  
 91         {  
 92             printf("%u\n",a);  
 93         }  
 94         memset(lNum,0,10);  
 95         memset(lRes,0,20);  
 96         ResLength = numLength = 0;  
 97           
 98   
 99     }  
100     else  
101     {  
102           
103         for (i=start[k!=0];i<=9;i++)  
104         {  
105             int t=a;  
106   
107             a = a*10+i;  
108             if(unique(a,k+1))  
109             {  
110                 rescurtive(k+1);  
111             }  
112             a =t;  
113   
114         }  
115     }  
116 }  
117 int main()  
118 {  
119   
120       
121     rescurtive(0);  
122   
123     return 0;  
124 }

 

posted on 2013-05-18 13:10  hazard  阅读(256)  评论(0)    收藏  举报

导航