對數字求特徵值是常用的編碼演算法,奇偶特徵是一種簡單的特徵值。對於乙個整數,從個位開始對每一位數字編號,個位是1號,十位是2號,以此類推。這個整數在第n位上的數字記作x,如果x和n的奇偶性相同,則記下乙個1,否則記下乙個0。按照整數的順序把對應位的表示奇偶性的0和1都記錄下來,就形成了乙個二進位制數字。比如,對於342315,這個二進位制數字就是001101。
這裡的計算可以用下面的**來表示:
數字數字
數字奇偶奇偶
偶奇奇奇
數字奇偶偶奇
偶奇偶奇
奇偶一致
二進位制位值
你的程式要讀入乙個非負整數,整數的範圍是[0,1000000],然後按照上述演算法計算出表示奇偶性的那個二進位制數字,輸出它對應的十進位制值。
輸入格式:
乙個非負整數,整數的範圍是[0,1000000]。
輸出格式:
乙個整數,表示計算結果。
輸入樣例:
輸出樣例:
時間限制:500ms記憶體限制:32000kb
首先明白解答本題的幾個關鍵點:
1.整數的分解(數字與數字每乙個對應位如何提取)
2.判斷奇偶是否一致
3.二進位制如何轉化為十進位制數字
對應問題解決辦法:
1.數字的每一位提取:可以採用%10再/10的辦法。例如135,從右到左依次提取個位、十位、百位數字,對於個位數字5,只需要%10就可以(135%10=5);對於十位數字3,只需把135的個位5去掉,然後再用相同的方法(即%10)就可以,那麼如何去掉個位數字5呢?這裡就要用到/10,(135/10=13),13%10=3;同樣的,提取百位數字1也是這種辦法。
數字的每一位提取:由於是從個位開始依次進行編號,所以我們可以設定乙個變數count,每次提取數字的某一位後,count值也隨之加1。
2.可以採用%2根據得到的值進行判斷奇偶。
3.二進位制轉化為十進位制:權值*二進位制數值。由於權值是從右向左依次擴大二倍的,所以需要乙個變數value來儲存,並每次擴大2倍。
圖例如下:
對應**:
#define _crt_secure_no_warnings 1
#includeint main()
else
num2 += digit*value;
num /= 10;
value *= 2;
} printf("%d", num2);
return 0;
}
但是,上述**也有缺點-執行效率不高。那個if語句其實沒有必要把digit=0也算出來。digit=0時最後轉換成十進位制可以不參與運算,因為0乘以任何數字都為0
改進方案:if語句只需把奇偶一致(digit=1)的判斷出來即可
改進**:
#define _crt_secure_no_warnings 1
#includeint main()
x /= 10;
value *= 2;
} printf("%d", sum);
return 0;
}
還可以利用pow函式算出2的次冪。
#define _crt_secure_no_warnings 1
#include#include#includeint main()
else
ret = ret + digit*pow(2, cnt - 1);
num /= 10;
} printf("%d", ret);
system("pause");
return 0;
}
數字特徵值(C語言)
題目內容 對數字求特徵值是常用的編碼演算法,奇偶特徵是一種簡單的特徵值。對於乙個整數,從個位開始對每一位數字編號,個位是1號,十位是2號,以此類推。這個整數在第n位上的數字記作x,如果x和n的奇偶性相同,則記下乙個1,否則記下乙個0。按照整數的順序把對應位的表示奇偶性的0和1都記錄下來,就形成了乙個...
c語言 數字特徵值
數字特徵值 5分 題目內容 對數字求特徵值是常用的編碼演算法,奇偶特徵是一種簡單的特徵值。對於乙個整數,從個位開始對每一位數字編號,個位是1號,十位是2號,以此類推。這個整數在第n位上的數字記作x,如果x和n的奇偶性相同,則記下乙個1,否則記下乙個0。按照整數的順序把對應位的表示奇偶性的0和1都記錄...
C語言 數字特徵值
c語言 數字特徵值 對數字求特徵值是常用的編碼演算法,奇偶特徵是一種簡單的特徵值。對於乙個整數,從個位開始對每一位數字編號,個位是1號,十位是2號,以此類推。這個整數在第n位上的數字記作x,如果x和n的奇偶性相同,則記下乙個1,否則記下乙個0。按照整數的順序把對應位的表示奇偶性的0和1都記錄下來,就...