排它平方数

  第四届蓝桥杯C/C++ A组第二题,题目如下:

  小明正看着 203879 这个数字发呆。原来,203879 * 203879 = 41566646641。这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。具有这样特点的6位数还有一个,请你找出它!

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

  首先把代码贴上来吧:

 1 #include<errno.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #include<stdarg.h>
 5 #include<stdio.h>
 6 int main(int argc,char *argv[])
 7 {
 8     char num[6];
 9     char *endptr;
10     endptr = num + 6;
11 
12     /**********************************构造六位数****************************************/
13     for(num[0]='1';num[0]<='9';num[0]++){
14     for(num[1]='0';num[1]<='9';num[1]++){
15         if(num[1]==num[0]) continue;
16 
17         for(num[2]='0';num[2]<='9';num[2]++){
18         if(num[2]==num[0] || num[2]==num[1]) continue;
19 
20         for(num[3]='0';num[3]<='9';num[3]++){
21             if(num[3]==num[0] || num[3]==num[1] || num[3]==num[2]) continue;
22 
23             for(num[4]='0';num[4]<='9';num[4]++){
24             if(num[4]==num[0] || num[4]==num[1] || num[4]==num[2] || num[4]==num[3]) continue;
25 
26             for(num[5]='0';num[5]<='9';num[5]++){
27             if(num[5]==num[0] || num[5]==num[1] || num[5]==num[2] || num[5]==num[3] || num[5]==num[4]) continue;
28     /**********************************End***********************************************/
29 
30     /**********************************对构造出来的数的进行判断****************************************/
31             long long numll;
32             long long resultll;
33             numll = strtol(num,&endptr,10);
34             resultll = numll * numll;
35             char result[20];
36             memset(result,0,20);
37             int loopi;  //用来遍历那个六位数的每一位
38 
39             snprintf(result,20,"%lld",resultll);
40 
41             for(int loop=0;loop<strlen(result);loop++)
42             {
43                 for(loopi=0;loopi<6;loopi++)
44                 {
45                 if(result[loop] == num[loopi])
46                     break;
47                 }
48                 if(loopi < 6)
49                 break;
50             }
51             if(6 == loopi)
52                 printf("%lld -- %s
",numll,result);
53     /******************************************End***************************************************/
54                                   }
55                               }
56                               }
57                           }
58                           }
59                        }
60 
61 
62     return 0;
63 }
View Code

  

  这个题目我的思路就是两步:

    1.构造六位数。(要求1和要求2)

    2.判断六位数是不是符合要求3

  首先说构造六位数,这个我就是首先把这个六位数按位存放在一个字符串中,然后第一位的范围从1~9,其余5位的范围是0~9。然后让每一位在其范围内进行遍历,每一位遍历到一个新的数字时,首先判断这个数字与前面几位是否产生了重复,如果存在重复的话,那么就跳过这个数字,继续遍历下一个数字。

  举个栗子,比如第一位首先是1,然后第二位首先是0,接下来第三位从0开始遍历,它发现0和1都和前面冲突了,它就是2。依次类推,我们可以得到,我们构造出来的第一个六位数就是102345。

  接下来来进行第二步,就是判断符不符和要求3.首先由于我们构造出来的这个六位数是存放在字符串中的,首先我们要把它转换成long long整型。这里需要注意的是一定要转换成long long整型,如果转换成long的话两个变量在相乘的时候会使用32位的寄存器,最终导致结果溢出。如果用long long型,那么编译器在编译的时候会考虑到这种情况,而作出相应的处理。(抱歉,这个相应的处理具体是啥,我还没搞清,所以只能这么含糊其词一句,还望见谅!)

  转换成long long之后,我们再算出这个六位数的平方,然后再通过snprint函数把它的平方转换成字符串。接下来就是开始判断了,具体做法就是对这个平方数的每一位进行遍历,分别与那个六位数的每一位进行比较,看一下是否相同,如果有相同的话,那么就证明这个数不符合要求,否则就将这个数输出。

  最后贴一下程序的运行结果,如下图所示:

  

  OK,That's all!

原文地址:https://www.cnblogs.com/bwangel23/p/4273113.html