题目描述
对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。
这里的计算可以用下面的表格来表示:
你的程序要读入一个非负整数,整数的范围是[0,1000000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。
提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。
输入格式:
一个非负整数,整数的范围是[0,1000000]。
输出格式:
一个整数,表示计算结果。
输入样例:
342315
输出样例:
13
思路
可以看出需要较多的变量来分别保存以下信息:
int x; //输入的整数
int digit; //每次取输入的最后一位数字
int num = 0; //数位:个位、十位、百位...
int same; //数字与数位奇偶一致性
int c = 1; //当前二进制位值
int ret = 0; //最终结果
根据题意可以写出代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int x; //输入的整数
int digit; //每次取输入的最后一位数字
int num = 0; //数位:个位、十位、百位...
int same; //数字与数位奇偶一致性
int c = 1; //当前二进制位值
int ret = 0; //最终结果
scanf("%d", &x);
while (x > 0) {
digit = x%10;
num += 1;
//数字数位奇偶一致性:如果都为奇或偶,则加起来为偶数,%2=0。否则加起来为奇数,%2!=0。
same = (digit+num)%2 == 0? 1:0;
ret += same*c;
c *= 2;
x/=10;
}
printf("%d\n", ret);
return 0;
}
结果
运行,输入342315,结果为13,正确。