PTA上面的查驗身份證,不知為何過不去第一個測驗點(自己在本地測驗可以通過,提交到PTA上卻過不了),求大神指點,代碼如下
#include<stdio.h>
#include<string.h>
int main()
{
char a[100][19];
int n,p=0,i,j,q;
int m;
int b[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char c[17]={'1','0','X','9','8','7','6','5','4','3','2'};
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
}
for(i=0;i<n;i++)
{
m=0;
q=0;
for(j=0;j<17;j++)
{
if(a[i][j]<='9'&&a[i][j]>='0')
{
m=m+(a[i][j]-'0')*b[j];
}
else
{
for(int k=0;k<19;k++)
{
printf("%c",a[i][k]);
}
printf("\n");
q++;
break;
}
}
if(q!=0) continue;
m=m%11;
if(c[m]==a[i][17])
p++;
else
{
for(int k=0;k<19;k++)
{
printf("%c",a[i][k]);
}
printf("\n");
}
}
if(p==n)
{
printf("All passed");
}
}
uj5u.com熱心網友回復:
原始題目要求是什么,要想通過除了演算法沒有問題外,你還要確保輸出的格式和要求的完全一樣最好貼出題目的完整要求
uj5u.com熱心網友回復:
一個合法的身份證號碼由17位地區、日期編號和順序編號加1位校驗碼組成。校驗碼的計算規則如下:首先對前17位數字加權求和,權重分配為:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后將計算的和對11取模得到值Z;最后按照以下關系對應Z值與校驗碼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
現在給定一些身份證號碼,請你驗證校驗碼的有效性,并輸出有問題的號碼。
輸入格式:
輸入第一行給出正整數N(≤100)是輸入的身份證號碼的個數。隨后N行,每行給出1個18位身份證號碼。
輸出格式:
按照輸入的順序每行輸出1個有問題的身份證號碼。這里并不檢驗前17位是否合理,只檢查前17位是否全為數字且最后1位校驗碼計算準確。如果所有號碼都正常,則輸出All passed
uj5u.com熱心網友回復:
演算法看不出來哪兒有問題是所有的都不通過,還是個別的?
如果是所有的,你嘗試修改三個地方看看
兩個是關于k的回圈, 有效范圍 0到17, 不是<19 而是小于18; 甚至直接把那個%c輸出,直接改成%s輸出a[i]好了
最后return 0;
測驗平臺往往是用管道方式來把檔案作為引數輸入和輸出,輸出不可見字符0也許會有區別(k回圈那里)
return 回傳值本來就是給呼叫它的系統使用的, 對于測驗平臺也一樣
還有就是檢查一下, 那個全部通過的單詞, 是否和你的printf里面的完全一樣,最好是復制粘貼過去
uj5u.com熱心網友回復:
太感謝大佬了,真的是,好幾天一直沒有過,按照你說的我把輸入和輸出全部改成%s以后,就全部過了,我還是剛剛接觸PTA上的這些題目,不勝感激啊轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/156947.html
標籤:C語言
上一篇:[Error] invalid conversion from 'char' to 'char*
下一篇:printf與scanf
