『ACM C++』 PTA 天梯赛练习集L1 | 016-017
今天開了兩個(gè)大會,時(shí)間都給占掉了,就刷了兩道題~ 明天加油!!!
?
------------------------------------------------L1-016----------------------------------------------------------
查驗(yàn)身份證
一個(gè)合法的身份證號碼由17位地區(qū)、日期編號和順序編號加1位校驗(yàn)碼組成。校驗(yàn)碼的計(jì)算規(guī)則如下:
首先對前17位數(shù)字加權(quán)求和,權(quán)重分配為:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后將計(jì)算的和對11取模得到值Z;最后按照以下關(guān)系對應(yīng)Z值與校驗(yàn)碼M的值:
Z:0 1 2 3 4 5 6 7 8 9 10 M:1 0 X 9 8 7 6 5 4 3 2現(xiàn)在給定一些身份證號碼,請你驗(yàn)證校驗(yàn)碼的有效性,并輸出有問題的號碼。
輸入格式:
輸入第一行給出正整數(shù)N(≤100)是輸入的身份證號碼的個(gè)數(shù)。隨后N行,每行給出1個(gè)18位身份證號碼。
輸出格式:
按照輸入的順序每行輸出1個(gè)有問題的身份證號碼。這里并不檢驗(yàn)前17位是否合理,只檢查前17位是否全為數(shù)字且最后1位校驗(yàn)碼計(jì)算準(zhǔn)確。如果所有號碼都正常,則輸出All passed。
輸入樣例1:
4 320124198808240056 12010X198901011234 110108196711301866 37070419881216001X輸出樣例1:
12010X198901011234 110108196711301866 37070419881216001X輸入樣例2:
2 320124198808240056 110108196711301862輸出樣例2:
All passed------------------------------------------------L1-016----------------------------------------------------------
?注解:這題有點(diǎn)小難度,WA了幾次,但思路還是很清晰的,這道題需要注意以下幾點(diǎn):
(1)注意scanf的輸入,他會吸換行,需要scanf(" %c",&id[j].number[i]);在%c前面補(bǔ)一個(gè)空格,表示吃掉換行。
即區(qū)分:scanf("%c",&answer) 與 scanf(" %c",&answer),后者只是在%前多了個(gè)空格,似乎沒有什么區(qū)別,但使用起來區(qū)別是很大的。
(2)注意對特殊元素‘X’符號的處理
· 代碼分塊:
第一步:構(gòu)建基本變量參數(shù):
int times,Z,num,count; float sum,T[17] = {7.0,9.0,10.0,5.0,8.0,4.0,2.0,1.0,6.0,3.0,7.0,9.0,10.0,5.0,8.0,4.0,2.0}; int check[11] = {1,0,40,9,8,7,6,5,4,3,2}; struct ID{char number[18];int illegal; }id[101];這里的T即為加權(quán)數(shù),建議補(bǔ).0,轉(zhuǎn)為浮點(diǎn)處理,以免后面除法出錯(cuò)。check即為對應(yīng)的驗(yàn)證碼
然后這里我對ID的吸取利用了一個(gè)結(jié)構(gòu)體,一個(gè)負(fù)責(zé)收數(shù)字信息,一個(gè)用來保存是否合法信息。
第二步:接受數(shù)據(jù)并進(jìn)行預(yù)先求和處理
for(int i = 0;i<18;i++){scanf(" %c",&id[j].number[i]);num = id[j].number[i] - '0';if(0<=num && num<=9) sum+=(num*(T[i]));else{if(i != 17){id[j].illegal = 1;count++;}}}這里需要注意,如果前17位出現(xiàn)了X,那么這個(gè)身份證一定是不合法的,直接否掉就可以了。
第三步:驗(yàn)證碼驗(yàn)證最后一位數(shù)
if(id[j].illegal != 1){Z = int(sum)%11;if(num != check[Z]){id[j].illegal = 1;count++;}}這里需要注意下取模需要整數(shù),因此需要轉(zhuǎn)換一下。
?
· AC代碼:
#include<stdio.h>int times,Z,num,count; float sum,T[17] = {7.0,9.0,10.0,5.0,8.0,4.0,2.0,1.0,6.0,3.0,7.0,9.0,10.0,5.0,8.0,4.0,2.0}; int check[11] = {1,0,40,9,8,7,6,5,4,3,2}; struct ID{char number[18];int illegal; }id[101]; int main() {scanf("%d ",×);count = 0;for(int j = 0;j<times;j++){sum = 0.0;for(int i = 0;i<18;i++){scanf(" %c",&id[j].number[i]);num = id[j].number[i] - '0';if(0<=num && num<=9) sum+=(num*(T[i]));else{if(i != 17){id[j].illegal = 1;count++;}}}if(id[j].illegal != 1){Z = int(sum)%11;if(num != check[Z]){id[j].illegal = 1;count++;}}}if(count == 0) printf("All passed\n");else for(int j = 0;j<times;j++) if(id[j].illegal == 1) puts(id[j].number);return 0; }?
·AC截圖:
?
?
?
?
------------------------------------------------L1-017----------------------------------------------------------
到底有多二
一個(gè)整數(shù)“犯二的程度”定義為該數(shù)字中包含2的個(gè)數(shù)與其位數(shù)的比值。如果這個(gè)數(shù)是負(fù)數(shù),則程度增加0.5倍;如果還是個(gè)偶數(shù),則再增加1倍。例如數(shù)字-13142223336是個(gè)11位數(shù),其中有3個(gè)2,并且是負(fù)數(shù),也是偶數(shù),則它的犯二程度計(jì)算為:3/11×1.5×2×100%,約為81.82%。本題就請你計(jì)算一個(gè)給定整數(shù)到底有多二。
輸入格式:
輸入第一行給出一個(gè)不超過50位的整數(shù)N。
輸出格式:
在一行中輸出N犯二的程度,保留小數(shù)點(diǎn)后兩位。
輸入樣例:
-13142223336輸出樣例:
81.82%------------------------------------------------L1-017----------------------------------------------------------
注解:這題唯一新知識點(diǎn)就是對‘%’符號的輸出,若想輸出這個(gè)符號,在printf里面應(yīng)該雙寫,即%%,即可出現(xiàn)%。
AC代碼:
#include<stdio.h> #include<string.h> char number[51]; int length,num2,shu; float fu,ou; int main() {scanf("%s",&number);fu = ou = 1;num2 = 0;length = strlen(number);for(int i = 0;i<length;i++){if(number[i] == '-') fu = 1.5;if(number[i] == '2') num2++;if(i == length - 1) if((number[i]-'0')%2 == 0) ou = 2.0;}if(fu == 1.5) printf("%.2f%%",(num2*fu*ou*100/(length-1)));else printf("%.2f%%",(num2*ou*100/(length)));return 0;}?
?
?
?
注:如果有更好的解法,真心希望您能夠評論留言貼上您的代碼呢~互相幫助互相鼓勵(lì)才能成長鴨~~
轉(zhuǎn)載于:https://www.cnblogs.com/winniy/p/10498836.html
總結(jié)
以上是生活随笔為你收集整理的『ACM C++』 PTA 天梯赛练习集L1 | 016-017的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谈谈一些有趣的CSS题目(十七)-- 不
- 下一篇: 连号区间数(2013年第四届c/c++