1. 程式人生 > >1048. 數字加密(20) PAT乙級真題

1048. 數字加密(20) PAT乙級真題

1048. 數字加密(20)

本題要求實現一種數字加密方法。首先固定一個加密用正整數A,對任一正整數B,將其每1位數字與A的對應位置上的數字進行以下運算:對奇數位,對應位的數字相加後對13取餘——這裡用J代表10、Q代表11、K代表12;對偶數位,用B的數字減去A的數字,若結果為負數,則再加10。這裡令個位為第1位。

輸入格式:

輸入在一行中依次給出A和B,均為不超過100位的正整數,其間以空格分隔。

輸出格式:

在一行中輸出加密後的結果。

輸入樣例:
1234567 368782971
輸出樣例:
3695Q8118
這道題一看到100位的正整數第一反應就應該是用字串。然而它這裡令個位為第1位,我們對這種一位位對應的字元處理又習慣從左邊開始,所以我用了一個函式去使字串顛倒過來。中間的過程就是按照題意模擬,我們需要在模擬的過程中注意的一點是A和B的位數可能不一樣,因為我們把數字顛倒過來了,所以少的位數應該用0補上。下面是我的程式碼:
#include<stdio.h>
#include<string.h>
void Chuli(char a[]);
void Xiangjia(char a[],char b[]);
int main(void)
{
    char a[101]={'0'},b[101]={'0'};
    int i=0,j;
    do
    {
        scanf("%c",&a[i]);
        i++;
    }while(a[i-1]!=' ');
    a[i-1]='\0';i=0;
    do
    {
        scanf("%c",&b[i]);
        i++;
    }while(b[i-1]!='\n');
    b[i-1]='\0';
    Chuli(a);Chuli(b);
    Xiangjia(a,b);
    Chuli(b);
    puts(b);
    return 0;
}
/* 將數字顛倒過來 */
void Chuli(char a[])
{
  char m[101];
  int s,i=0;
  s=strlen(a);
  for (;i < s/2;i++)
  {
    a[i]=a[i]+ a[s-i-1];
        a[s-i-1]=a[i]- a[s-i-1];
        a[i]=a[i]- a[s-i-1];
  }
}

void Xiangjia(char a[],char b[])
{
    int i=0,c;
    do
    {
        if ( (a[i]<'0') || (a[i] >'9') ) a[i]='0';
        if ( (b[i]<'0') || (b[i] >'9') ) b[i]='0';
        c=a[i]-48;
        if (i%2==0)                              //奇數位
        {
            c=(c+b[i]-48)%13;
            if (c==10) b[i]='J';
            else if (c==11) b[i]='Q';
            else if (c==12) b[i]='K';
            else b[i]=c+48;
        }
        else                                      //偶數位
        {
            c=b[i]-48-c;
            if (c<0) c+=10;
            b[i]=c+48;
        }
        i++;
    }while((b[i]!='\0')||(a[i]!='\0'));
}