#9334: 找不出錯誤 請幫忙解答


CK85701 (CG6701)

學校 : 臺中市私立明道高級中學
編號 : 42478
來源 : [1.172.90.54]
最後登入時間 :
2016-09-18 23:40:18
a020. 身分證檢驗 | From: [121.254.106.113] | 發表日期 : 2014-10-18 20:46

 #include<stdio.h>

int main()

{

char s;

int num;

while(scanf("%c%d", &s, &num)!=EOF)

{

int f;

switch(s)

{

case 87:

f=32;

break;

case 90:

f=33;

break;

case 73:

f=34;

break;

case 79:

f=35;

break;

};

if(s>=65 && s<=72) f=s-55;

else if(s>=74 && s<=78) f=s-56;

else if(s>=80 && s<=86) f=s-57;

else if(s==88 || s==89) f=s-58;

int i;

int sum=(f%10)*9+(f/10);

for(i=0;i<9;i++)

{

if(i==0)

{

sum+=num%10;

num/=10;

i+=1;

}

sum+=(num%10)*i;

num/=10;

}

if(sum%10==0) printf("real\n");

else printf("fake\n");

}

return 0;

}

 

第 1 測資點(0%): OLE () 
冗餘輸出

請勿輸出題目未要求的文字:  fake
 
#10604: Re:找不出錯誤 請幫忙解答


d2513850 (林勇智)

學校 : 崑山科技大學
編號 : 5102
來源 : [114.140.80.239]
最後登入時間 :
2024-12-03 11:08:59
a020. 身分證檢驗 | From: [111.184.249.106] | 發表日期 : 2016-01-02 23:45

 #include

int main()

{

char s;

int num;

while(scanf("%c%d", &s, &num)!=EOF)

{

int f;

switch(s)

{

case 87:

f=32;

break;

case 90:

f=33;

break;

case 73:

f=34;

break;

case 79:

f=35;

break;

};

if(s>=65 && s<=72) f=s-55;

else if(s>=74 && s<=78) f=s-56;

else if(s>=80 && s<=86) f=s-57;

else if(s==88 || s==89) f=s-58;

int i;

int sum=(f%10)*9+(f/10);

for(i=0;i<9;i++)

{

if(i==0)

{

sum+=num%10;

num/=10;

i+=1;

}

sum+=(num%10)*i;

num/=10;

}

if(sum%10==0) printf("real\n");

else printf("fake\n");

}

return 0;

}

 

第 1 測資點(0%): OLE () 
冗餘輸出

請勿輸出題目未要求的文字:  fake

應該在"#include<stdio.h>"的後面加入"#include<string.h>"(string.h用來處裡字串的)

在"int main()"的前面加上int型態的z陣列"int z[26]={10,11,12,13,14,15,16,17,34,18,19,20,21,22,35,23,24,25,26,27,28,29,32,30,31,33};"

主函數"int main()"要宣告:

int a,b[10],w,s;

char x[1024];

(a用作迴圈計數器,w用作存放身分證號碼是否錯誤的旗標,s存放總和)

(因為x的字元數不明)

然後是while迴圈,要改成這樣

while(scanf("%s",x)!=EOF){
        w=0;
        if(strlen(x)!=10){//錯誤的身分證號碼長度
            w=1;
        }else{
            if(x[0]<65||x[0]>90){//錯誤的身分證號碼第1個字元
                w=1;
            }else{
                b[0]=z[x[0]-65];
                for(a=1;a<10;a++){
                    if(x[a]<48||x[a]>57){//錯誤的身分證號碼第2-10個字元
                        w=1;
                    }else{
                        b[a]=x[a]-48;
                    }
                }
                if(x[1]<49||x[1]>50){//錯誤的身分證號碼第2個字元
                    w=1;
                }
                s=(b[0]%10)*9+(b[0]/10);
                for(a=1;a<9;a++){
                    s+=b[a]*(9-a);
                }
                s+=b[9];
                if(s%10!=0){//錯誤的身分證號碼第10位字元
                    w=1;
                }
            }
        }
        if(w==0){
            printf("real\n");
        }else{
            printf("fake\n");
        }
    }

一開始先判斷strlen(x)是否為10,strlen(x)用來取得字串長度,若不是10則送出fake

若是10則判斷x[0]是否在ASCII碼的65-90(A-Z),若不在65-90則送出fake

若在65-90則用for迴圈判斷x[1]-x[9]是否在ASCII碼的48-57(0-9),若不在48-57則送出fake

若在48-57則判斷x[1]是否為ASCII碼的49或50(1或2),若不在49-50則送出fake

若在49-50則算s:s=(b[0]%10)*9+(b[0]/10);

再用for迴圈加b[a]*(9-a)到s:s+=b[a]*(9-a);

再加b[9]的值:s+=b[a]*(9-a);

再讓s%10,若s%10不是0則送出fake

否則送出real,結束判斷再讀另1筆測資

最後才"return 0;"結束程式

 
ZeroJudge Forum