题目内容:
对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是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>
int main() {
int n = 0, a = 0,num = 0,n_2 = 0,n_end = 0,flag_1 = 1;
scanf("%d", &n);
//取得每位数
int counter = 1;
while (counter <= a || n>0) {
num = n % 10; //num为每次循环中数字n的最右一位
n /= 10; //去掉数字最右位,使得每位数字都能被取出
a++; //a++为数字一共的位数
counter++; //作为停止循环的条件
//判断原来数字的每一位的奇偶
int odd = 1, even = 0;
if (num % 2 != 0 ) {
num = 1;
}else {
num = 0;
}
//判断从右往左位次的奇偶
if (a % 2 != 0) {
a = 1;
}
else {
a = 0;
}
//判断奇偶是否一致,并得到倒叙的二进制数
if (num + a == 2 || num + a == 0) {
n_2 = 1;
}else{
n_2 = 0;
}
//得到十进制数
n_end += n_2 * flag_1;
flag_1 *= 2;
}
printf("%d", n_end);
}
注:初步学习,不足之处多多指教。