【PAT】B1048 数字加密
?
題目描述
本題要求實(shí)現(xiàn)一種數(shù)字加密方法。首先固定一個(gè)加密用正整數(shù) A,對(duì)任一正整數(shù) B,將其每 1 位數(shù)字與 A 的對(duì)應(yīng)位置上的數(shù)字進(jìn)行以下運(yùn)算:對(duì)奇數(shù)位,對(duì)應(yīng)位的數(shù)字相加后對(duì) 13 取余——這里用 J 代表 10、Q 代表 11、K 代表 12;對(duì)偶數(shù)位,用 B 的數(shù)字減去 A 的數(shù)字,若結(jié)果為負(fù)數(shù),則再加 10。這里令個(gè)位為第 1 位。
輸入格式:
輸入在一行中依次給出 A 和 B,均為不超過 100 位的正整數(shù),其間以空格分隔。
輸出格式:
在一行中輸出加密后的結(jié)果。
輸入樣例:
1234567 368782971輸出樣例:
3695Q8118?首先貼出菜雞的代碼(至今存在測(cè)試用例錯(cuò)誤,6個(gè)測(cè)試用例只通過4個(gè),歡迎指出代碼中的不足)
#include <iostream> using namespace std; int main(){string a,b;cin>>a>>b;int max,min;int len_a=a.length();int len_b=b.length();if(len_a>len_b){max=len_a;min=len_b;}else{max=len_b;min=len_a; }char c[max+1];for(int j=0;j<len_a;j++){ //反轉(zhuǎn)數(shù)組1,且時(shí)間復(fù)雜度很高int temp_a=a[len_a-1];for(int i=len_a;i>=2+j;i--){a[i-1]=a[i-2];}a[j]=temp_a;}for(int j=0;j<len_b;j++){ //反轉(zhuǎn)數(shù)組2,且時(shí)間復(fù)雜度很高int temp_b=b[len_b-1];for(int i=len_b;i>=2+j;i--){b[i-1]=b[i-2];}b[j]=temp_b;}for(int i=0;i<max;i++){if(i%2==1){if(i<min){int temp=(b[i]-'0')-(a[i]-'0'); //因?yàn)橹苯幼址鄿p出現(xiàn)的問題1if(temp<0){temp=(temp+10);}c[i]=temp+'0'; //因?yàn)橹苯幼址鄿p出現(xiàn)的問題2}else if(i>=min){if(len_a>len_b){c[i]=a[i];}else if(len_a<len_b){c[i]=b[i];}}}else if(i%2==0){//奇數(shù)位 if(i<min){int temp=(a[i]-'0'+b[i]-'0')%13; //因?yàn)橹苯幼址鄿p出現(xiàn)的問題3if(temp<10){c[i]=temp+'0'; //因?yàn)橹苯幼址鄿p出現(xiàn)的問題4}else if(temp>=10&&temp<=12){if(temp==10){c[i]='J';}else if(temp==11){c[i]='Q';}else if(temp==12)c[i]='K';}}else if(i>=min){if(len_a>len_b){c[i]=a[i];}else if(len_a<len_b){c[i]=b[i];}}}}for(int j=0;j<max;j++){ //反轉(zhuǎn)數(shù)組3,且時(shí)間復(fù)雜度很高int temp=c[max-1];for(int i=max;i>=2+j;i--){c[i-1]=c[i-2];}c[j]=temp;}for(int i=0;i<max;i++)cout<<c[i];return 0; }?代碼很長(zhǎng),標(biāo)記了一些重復(fù)性的地方,錯(cuò)的多的地方,留待未來回顧的時(shí)候提醒自己哪些地方自己錯(cuò)的比較多、作了重復(fù)的東西。首先講一下個(gè)人那道題目的思考,第一步我看到輸入樣例的時(shí)候直觀的把A、B兩個(gè)數(shù)定義為字符串(不知道這個(gè)習(xí)慣有哪些問題,看一些博主和參考書上第一位數(shù)組,雖然本質(zhì)上兩者類似),然后,就按正常的邏輯思路,在反轉(zhuǎn)數(shù)列這里吸取第一個(gè)教訓(xùn)——沒有把常用功能段用以函數(shù)的形式固定下來以及第二個(gè)教訓(xùn)——for循環(huán)的時(shí)間復(fù)雜度可以減少。在字符轉(zhuǎn)換的過程中,迎來了第三個(gè)教訓(xùn)——忘記了字符數(shù)字和整型數(shù)字的轉(zhuǎn)化,白白浪費(fèi)很多時(shí)間。綜合來書還有第四點(diǎn)教訓(xùn)——沒有優(yōu)化好代碼。
經(jīng)驗(yàn)教訓(xùn)
參考代碼
下面給出參考代碼,無論實(shí)在空間復(fù)雜度還是時(shí)間復(fù)雜度上都優(yōu)化了本人上面的代碼。留作參考:?
#include <cstdio> #include <cstring>const int maxn=110;char a[maxn],b[maxn],c[maxn];void reverse(char s[]){ //將常用的代碼以函數(shù)的形式固定下來方便調(diào)用int len=strlen(s);for(int i=0;i<len/2;i++){int temp=s[i];s[i]=s[len-1-i];s[len-1-i]=temp;}}int main(){scanf("%s %s",a,b);reverse(a);reverse(b);int lenA=strlen(a);int lenB=strlen(b);int len=lenA>lenB?lenA:lenB;for(int i=0;i<len;i++){int numA=i<lenA?a[i]-'0':0; //優(yōu)化了算法,減少了重復(fù)量int numB=i<lenB?b[i]-'0':0;if(i%2==0){int temp=(numA+numB)%13;if(temp==10) c[i]='J';else if(temp==11) c[i]='Q';else if(temp==12) c[i]='K';else c[i]=temp+'0';}else{int temp=numB-numA;if(temp<0) temp=temp+10;c[i]=temp+'0';}}reverse(c);puts(c);return 0;}?
總結(jié)
以上是生活随笔為你收集整理的【PAT】B1048 数字加密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通俗易懂解释知识图谱
- 下一篇: 【排序】几种简单的排序(冒泡、选择、插入