1. 程式人生 > >PAT——乙級1006:換個格式輸出整數&乙級1021:個位數統計&乙級1031:查驗身份證

PAT——乙級1006:換個格式輸出整數&乙級1021:個位數統計&乙級1031:查驗身份證

all tst 順序 sub ner 簡單的 驗證 乙級 wrong

1006 換個格式輸出整數 (15 point(s))

讓我們用字母 B 來表示“百”、字母 S 表示“十”,用 12...n 來表示不為零的個位數字 n<10),換個格式來輸出任一個不超過 3 位的正整數。例如 234 應該被輸出為 BBSSS1234,因為它有 2 個“百”、3 個“十”、以及個位的 4。

輸入格式:

每個測試輸入包含 1 個測試用例,給出正整數 n(<1000)。

輸出格式:

每個測試用例的輸出占一行,用規定的格式輸出 n。

輸入樣例 1:

234

輸出樣例 1:

BBSSS1234

輸入樣例 2:

23

輸出樣例 2:

SS123

我的代碼

我是想練習一下字符串操作,就弄的稍微麻煩了點。

#include<cstdio>

int main(){
    char out[30];
    int p=0,n;
    scanf("%d",&n);
    for(int i=n/100;i>0;i--){
        out[p]=B;
        p++;
    }
    for(int i=n%100/10;i>0;i--){
        out[p]=S;
        p++;
    }
    for(int i=1;i<=n%10;i++){
        out[p]=i+0x30
; p++; } out[p]=\0; printf("%s\n",out); return 0; }

1021 個位數統計 (15 point(s))

給定一個 k 位整數 N=d?k?1??10?k?1??+?+d?1??10?1??+d?0?? (0d?i??9, i=0,?,k?1, d?k?1??>0),請編寫程序統計每種不同的個位數字出現的次數。例如:給定 N=100311,則有 2 個 0,3 個 1,和 1 個 3。

輸入格式:

每個輸入包含 1 個測試用例,即一個不超過 1000 位的正整數 N。

輸出格式:

N 中每一種不同的個位數字,以 D:M

的格式在一行中輸出該位數字 D 及其在 N 中出現的次數 M。要求按 D 的升序輸出。

輸入樣例:

100311

輸出樣例:

0:2
1:3
3:1

我的代碼

#include<cstdio>

int main(){
    char num[1000];
    int bit[10]={0};
    scanf("%s",num);
    char *p=num;
    while(*(p)!=\0){
        bit[*(p)-0x30]++;
        p++;
    }
    for(int i=0;i<10;i++){
        if(bit[i]!=0){
            printf("%d:%d\n",i,bit[i]);
        }
    }
    return 0;
}

1031 查驗身份證 (15 point(s))

一個合法的身份證號碼由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

輸入樣例1:

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

輸出樣例1:

12010X198901011234
110108196711301866
37070419881216001X

輸入樣例2:

2
320124198808240056
110108196711301862

輸出樣例2:

All passed

我的代碼

#include<cstdio>

int main(){
    int weight[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2},n,weight_temp,wrong=0;
    char M[11]={1,0,X,9,8,7,6,5,4,3,2},id[19];
    scanf("%d",&n);
    while(n--){
        weight_temp=0;
        scanf("%s",id);
        for(int i=0;i<18;i++){
            if(id[i]>=0x30&&id[i]<=0x39&&i<17){
                weight_temp+=(id[i]-0x30)*weight[i];
            }
            else if(i==17){
                weight_temp=weight_temp%11;
                if(id[i]!=M[weight_temp]){
                    printf("%s\n",id);
                    wrong++;
                }
            }
            else{
                printf("%s\n",id);
                wrong++;
                break;
            }
        }
    }
    if(!wrong) printf("All passed\n");
    return 0;
}

第一次知道身份證校檢碼是這樣用的。

這三道簡單的題。。。

PAT——乙級1006:換個格式輸出整數&乙級1021:個位數統計&乙級1031:查驗身份證