标签:
第四届蓝桥杯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 }
这个题目我的思路就是两步:
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