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