日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【PAT】B1048 数字加密

發(fā)布時(shí)間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【PAT】B1048 数字加密 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

題目描述

本題要求實(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)

  • 明知道后面還有需要用到反轉(zhuǎn)的地方,卻沒有用函數(shù)固定下來,重復(fù)的做一些類似的工作,增加代碼的長(zhǎng)度和內(nèi)存。
  • 在用到反轉(zhuǎn)數(shù)組功能的地方,可以把時(shí)間復(fù)雜度變可以從O()為O(n),這是刷題不足的表現(xiàn)。
  • 字符型數(shù)字和整型數(shù)字不同,字符型數(shù)字在ASCLL碼中有編號(hào),字符型數(shù)字變?yōu)檎蛿?shù)字可以表示為(c-'0'),整型數(shù)字變?yōu)樽址蛿?shù)字則可以表示為(c+'0'),c[0,9],。
  • 其實(shí)在做題的時(shí)候,多花點(diǎn)時(shí)間琢磨一下流程和優(yōu)化一下算法,在編碼過程中可以減少編碼的時(shí)間、編碼過程中邏輯混亂帶來的時(shí)間浪費(fèi)以及回過頭來修改代碼的理解度。這三個(gè)時(shí)間的累加完全超過了編碼前整理思路和優(yōu)化算法的時(shí)間。在考試競(jìng)賽中尤為突出。
  • 參考代碼

    下面給出參考代碼,無論實(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。