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

乙級 1048. 數字加密(20)

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

輸入格式:

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

輸出格式:

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

輸入樣例: 
1234567 368782971 
輸出樣例: 

3695Q8118

這題最坑在我看錯了,後來發現右邊才是第一位,一口老血吐出來。

#include<cstdio>

#include<cstring>

int main(void)

{

char hash[13]={'0','1','2','3','4','5','6','7','8','9','J','Q','K'};

char str[250];

gets(str);

int len =strlen(str);

int qi_id1=0,qi_id2;

int len1,len2;

for(int i=0;i<len;i++)

{

if(str[i]==' ')

{

len1=i;

qi_id2=i+1;

len2 = len - len1-1;

break;

}

}

int n,temp,num=1;

if(len2>=len1)

{

num =len2;

n =len2 -len1;

for(int i =0;i<n;i++)

{

num--;

temp= str[qi_id2++]-'0';

printf("%c",hash[temp]);

}

for(int i=0;i<len1;i++)

{

if(num%2==0)

{

num--;

temp = str[qi_id2++] -'0'-str[qi_id1++] +'0';

if(temp<0) temp =temp +10;

printf("%c",hash[temp]);

}

else

{

num--;

temp = str[qi_id2++] -'0'+str[qi_id1++] -'0';

temp =temp%13;

printf("%c",hash[temp]);

}

}

}

else

{num=len1;

n = len1 -len2;

for(int i =0;i<n;i++)

{

if(num%2==0)

{temp= str[qi_id1++]-'0';

temp=-temp;

if(temp<0) temp =temp+10;

printf("%c",hash[temp]);}

else {

temp =str[qi_id1++]-'0';

printf("%c",hash[temp]);

}

num--;

}

for(int i=0;i<len2;i++)

{

if(num%2==0)

{

num--;

temp = str[qi_id2++] -'0'-str[qi_id1++] +'0';

if(temp<0) temp =temp +10;

printf("%c",hash[temp]);

}

else

{

num--;

temp = str[qi_id2++] -'0'+str[qi_id1++] -'0';

temp =temp%13;

printf("%c",hash[temp]);

}

}

}

}