21. 校验码
【問題描述】
傳送一個B(B≤16)進(jìn)制的數(shù)值N時,最后加上一個一位(B進(jìn)制的)校驗碼,使得N加上校驗位后能被B-1整除。比如十進(jìn)制的數(shù)值12310,其校驗碼就是3,因為十進(jìn)制數(shù)值123310能被9整除。16進(jìn)制的數(shù)7816,其校驗碼為0,因為16進(jìn)制的78016是15的倍數(shù)。超過十進(jìn)制后,用字母a表示10,字母b表示11,字母c表示12,字母d表示13,字母e表示14,字母f表示15。
告訴你進(jìn)制B,以及一個B進(jìn)制的正整數(shù)N,要求你計算正整數(shù)N在B進(jìn)制下的校驗碼。
【輸入形式】
輸入第一行正整數(shù)t (10 ≤ n ≤ 100),表示有多少組測試數(shù)據(jù)。
后面有t行,每行兩個正整數(shù)B,N(2≤ B≤16),中間用一個空格隔開,B是10進(jìn)制整數(shù),N用B進(jìn)制形式表示。測試數(shù)據(jù)保證沒有非法的B進(jìn)制數(shù)N(也即N中每一位都是在0到B-1之間,沒有前導(dǎo)0)。
40%的測試數(shù)據(jù)N的位數(shù)L 1 ≤ L≤ 10;
30%的測試數(shù)據(jù)N的位數(shù)L 1 ≤ L≤ 102;
20%的測試數(shù)據(jù)N的位數(shù)L 1 ≤ L≤ 103;
10%的測試數(shù)據(jù)N的位數(shù)L 1 ≤ L≤ 104;
【輸出形式】
對于每組測試數(shù)據(jù),輸出一位占一行:正整數(shù)N在B進(jìn)制下的校驗碼。(如果校驗碼可以為B-1,也可以為0,輸出0)。
【樣例輸入】
4 10?123 16?78 16?1234321 12?ab【樣例輸出】
3 0 e 1【樣例說明】
第一行的4表示有4組測試數(shù)據(jù),下面四行,每行一組測試數(shù)據(jù)。
第一組測試數(shù)據(jù) 10進(jìn)制數(shù)123 最后添加檢驗碼3,10進(jìn)制數(shù)1233是9(=10-1)的倍數(shù)
第二組測試數(shù)據(jù) 16進(jìn)制數(shù)78 最后添加檢驗碼0,16進(jìn)制數(shù)780是15(=16-1)的倍數(shù)
第三組測試數(shù)據(jù) 16進(jìn)制數(shù)1234321 最后添加檢驗碼e(=14),16進(jìn)制數(shù)1234321e是15(=16-1)的倍數(shù)
第四組測試數(shù)據(jù) 12進(jìn)制數(shù)ab 最后添加檢驗碼1,12進(jìn)制數(shù)ab1是11(12-1)的倍數(shù)
【Tips】
B進(jìn)制的數(shù)能被B-1整除,當(dāng)且僅當(dāng)各位數(shù)字和能被B-1整除。
第一組測試數(shù)據(jù) 10進(jìn)制數(shù)123 最后添加檢驗碼3,10進(jìn)制數(shù)1233各位數(shù)字和是9,是9的倍數(shù)
第二組測試數(shù)據(jù) 16進(jìn)制數(shù)78 最后添加檢驗碼0,16進(jìn)制數(shù)780各位數(shù)字和是15,是15的倍數(shù)
第三組測試數(shù)據(jù) 16進(jìn)制數(shù)1234321 最后添加檢驗碼e,16進(jìn)制數(shù)1234321e各位數(shù)字和是30,是15的倍數(shù)
第四組測試數(shù)據(jù) 12進(jìn)制數(shù)ab 最后添加檢驗碼1,12進(jìn)制數(shù)ab1各位數(shù)字和是22,是11的倍數(shù)
注意:查看題干最后的tips,將會變得十分簡單 。
#include<bits/stdc++.h> using namespace std; int numchange(char);//將輸入的字母轉(zhuǎn)換為相應(yīng)的數(shù)字 char charchange(int sss);//將所得校驗碼轉(zhuǎn)換為相應(yīng)的字母 int main() {int t;//測試組數(shù)cin>>t;while(t--) {int B;//進(jìn)制string n;//cin>>B;cin>>n;int key=B-1;int sum=0;int temp;char ckey;for(int i=0; i<n.size(); i++) {if(n[i]>='a'&&n[i]<='f') { //需要進(jìn)行轉(zhuǎn)換temp=numchange(n[i]);} else {stringstream ss;ss<<n[i];ss>>temp;ss.clear();}sum+=temp;}for(int j=0; j<=15; j++) {if((sum+j)%key==0) {if(j>=0&&j<=9) {cout<<j<<endl;break;} else {ckey=charchange(j);cout<<ckey<<endl;break;}}}} } int numchange(char ss) {int temp1;switch(ss) {case 'a': {temp1=10;break;}case 'b': {temp1=11;break;}case 'c': {temp1=12;break;}case 'd': {temp1=13;break;}case 'e': {temp1=14;break;}case 'f': {temp1=15;break;}}return temp1; } char charchange(int sss) {char temp2;switch(sss) {case 10: {temp2='a';break;}case 11: {temp2='b';break;}case 12: {temp2='c';break;}case 13: {temp2='d';break;}case 14: {temp2='e';break;}case 15: {temp2='f';break;}}return temp2; }總結(jié)
- 上一篇: 水库大坝的安全监测内容包括哪些?
- 下一篇: arduino采集数据结合掌控版使用mi