zoukankan      html  css  js  c++  java
  • 数字特征值

    题目内容:

    对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。

    这里的计算可以用下面的表格来表示:

    数字

    3

    4

    2

    3

    1

    5

    数位

    6

    5

    4

    3

    2

    1

    数字奇偶

    数位奇偶

    奇偶一致

    0

    0

    1

    1

    0

    1

    二进制位值

    32

    16

    8

    4

    2

    1

    你的程序要读入一个非负整数,整数的范围是[0,1000000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。

    提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。

     

    输入格式:

    一个非负整数,整数的范围是[0,1000000]。

    输出格式:

    一个整数,表示计算结果。

    输入样例:

    342315

    输出样例:

    13

    时间限制:500ms内存限制:32000kb
     
    答案:

    #include<stdio.h>
    #include<math.h>
    int main(){
      int a;
      int n=0;
      int dig,mask;
      int t=0,reg=0;
      // 0-1000000
      scanf("%d",&a);
      //a=342315;
      //a=5;
      while(a>0&&a<=1000000){
        if(a!=0){
          dig=a%10;
          a/=10;
          n++;

          if(dig%2==0){
            mask=1;//这一位是偶
          }else{
            mask=-1;//这一位是奇
          }
          if(mask==pow(-1,n)){
          t=pow(2,n-1);
          reg+=t;
          }

    }
    printf("%d",reg);

    return 0;
    }

    思路:

    1.输入一个数字,要把它的每一位都取出来(需要使用循环,先dig=a%10,再a/=10抹掉最右位,当a=0时停止循环),用dig变量保存,还要判断它的位数,这里需要一个计数器,用变量n来保存,首先初始化为0;

    2.用变量mask=-1表示dig为奇数,mask=1来表示dig为偶数,用if(mask==pow(-1,n)){}来判断dig与它对应的数字(有一个特性:个位数为奇数,十位数为偶数,百位数为奇数......)的奇偶性是否相同;

    3.t变量类似dig来保存2进制数的每一位表示的十进制数,t=pow(2,n-1);

    4.reg变量初始化为0来保存结果,reg+=t。

  • 相关阅读:
    【线程控制:线程休眠】
    【线程调度-优先级】
    【多线程实现方案一:继承Thread 类】
    【多线程概述】
    【使用Mybatis-Generator自动生成Mapper、Model、Mapping相关文件】
    【springmvc集成mybatis框架】
    【UltraISO制作centos7系统安装盘】
    【己有原码, 为何还有反码和补码?】
    【原码, 反码, 补码的基础概念和计算方法】
    【数据类型】
  • 原文地址:https://www.cnblogs.com/zhhjthing/p/7711447.html
Copyright © 2011-2022 走看看