码迷,mamicode.com
首页 > 其他好文 > 详细

排它平方数

时间:2015-02-04 20:20:52      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

  第四届蓝桥杯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\n",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!

排它平方数

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!