题目内容:
对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是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 |
按照二进制位值将1的位的位值加起来就得到了结果13。
你的程序要读入一个非负整数,整数的范围是[0,100000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。
输入格式:
一个非负整数,整数的范围是[0,100000]。
输出格式:
一个整数,表示计算结果。
输入样例:
342315
输出样例:
13
本人的满分通过答案,写在此方便以后查看
#include <stdio.h> #include <math.h> int main(){ int num; int count=0; int a=0; int dig=0; scanf("%d",&num); do{ count ++; a=num%10; if((a+count)%2==0){ dig=dig+pow(2,count-1); } num /=10; }while(num>0); printf("%d",dig); return 0; }
PS:数字奇偶和数位奇偶比较异同,等价于求两数之和是否为偶数。
这是我独自误打误撞想到的,以为别人都是这么想,后来翻看讨论区,发现不少人是先两个数都单一判断,最后再来个综合判断,那样挺麻烦的。而且网友ikeltis早于我想到此思路,发到谈论区还受到了翁老师的微博表扬,想到自己也是独立思考想到的此法子,莫名的感到了一些鼓舞,哈哈,留此文纪念下。
附上网友ikeltis的代码(未征得同意,见谅)
/* *思路:数字奇偶和数位奇偶相同时记为1,等价于数字与数位之和为偶数时记为1 *不知道 C 语言的指数怎么求,就用 h 做了累乘 */ #include<stdio.h> int main() { int n=1; int h=1; int num; int flag=0; scanf("%d",&num); while(num != 0) { if((num+n)%2==0) { flag = flag + h; } n++; num = num / 10;//删去最后一位数 h=h*2; } printf("%d ",flag); return 0; }