題目內容:
對數字求特征值是常用的編碼算法,奇偶特征是一種簡單的特征值。對於一個整數,從個位開始對每一位數字編號,個位是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\n",flag); return 0; }
