zoukankan      html  css  js  c++  java
  • 排它平方数

      第四届蓝桥杯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!

  • 相关阅读:
    第一次上传文件到linux服务器
    @JsonFormat与@DateTimeFormat的区别
    Tomcat端口被占用处理
    简单的Tomcat部署
    PHP源码加密,zend guard与ioncube
    PHP计算年龄
    My97DatePicker时间控件 JQuery UI
    php二维数组自定义排序
    CodeSmith Generator 7.0.2激活步骤
    SQL Server Management Studio 2008版本的安装
  • 原文地址:https://www.cnblogs.com/bwangel23/p/4273113.html
Copyright © 2011-2022 走看看