强行刷段位第九天
今天感覺感冒基本好了。
就是還有鼻涕。
這個博客不像是用來記錄刷題的,好像是用來記錄感冒歷程的(笑哭)
就當寫日記了。。。反正沒什么人看~
?
洗了個頭,掃了個地。
該買一些洗發水什么的了,這回病好了,抽時間要去買點東西了。
現在感覺渾身充滿了力量~又要開始間歇性躊躇滿志了!
想過年前拔牙,這樣過年就可以少吃點了。。。
?
突然有點舍不得減掉我的頭發了。。。
因為前兩天買了個帽子,本來是為了萬一剪頭發了不好看,可以戴著擋一擋。
結果發現這個帽子長卷發戴著更合適一點。。。
?
不管了~年前肯定是要剪的,作為2019的斷舍離~
?
感冒好了話都變多了。。。
做題做題。
高精度第一題:
題目:
給出兩個正整數A和B,計算A-B的值。保證A和B的位數不超過500位。
輸入描述:
讀入兩個用空格隔開的正整數
輸出描述:
輸出A-B的值
樣例輸入:
3 12
樣例輸出:
-9
數據范圍及提示:
兩個正整數的位數不超過500位
我的答案:
這道題寫完通過的時候我一臉呆滯。。。
就。。。通過了???
我明明只是要提交一下,獲取一下出錯用例,然后接著寫啊。。。
我明明沒有寫0000001這種情況的處理啊。。。
好吧。。。
本著認真嚴謹的態度,我把去除0的工作加上了之后再次提交,成功通過,撒花花~
?
頭一次寫高精度,開始還是有點蒙,不過順著字符串這個思路,暴力模擬下去還是不難想到的。
就醬。
?
哦,對,之前出了個小菜雞沒見過的錯誤。說我的minus函數ambiguous。
查了一下原來是minus和庫函數重名,隨手改了一下名字就通過啦。以后長記性~
#include <iostream> #include <string.h> using namespace std; //測試數據:19987787889 98776665int mark(char a[],char b[],int alen,int blen) //需要輸出負號則返回1 {int res=0;int i=0;if(alen<blen) res=1;if(alen==blen){for(i=0;i<alen;i++){if(a[i]<b[i]){res=1;break;}}}return res; }void minuss(char a[],char b[],int alen,int blen) //保障 a>b {int c[500];int arear=alen-1;int brear=blen-1;int i=0;int flag=0;while(arear>=0 && brear>=0){if(a[arear]>=b[brear]) c[flag++]=a[arear]-b[brear];else{c[flag++]=10-b[brear]+a[arear];a[arear-1]--;}arear--;brear--;}while(arear>=0){if(a[arear]>='0') c[flag++]=a[arear]-'0';else{c[flag++]=10-'0'+a[arear];a[arear-1]--;}arear--;}flag--;while(c[flag]==0){flag--;}for(i=flag;i>=0;i--){cout<<c[i];} } int main() {char a[500];char b[500]; cin>>a>>b;int alen=0,blen=0,flag=0;alen=strlen(a);blen=strlen(b);flag=mark(a,b,alen,blen); //輸出符號 if(flag==1){cout<<"-";minuss(b,a,blen,alen);}else minuss(a,b,alen,blen);return 0; }。。。
剛發出來就被Kevin大神看見了,
告訴我不能像上面那樣獲取錯誤用例,只能按照題目來寫,正常機試提交只有一個結果正確或者錯誤
這樣容易養成依賴,會覺得反正每次可以改錯誤樣例。。。
我還以為我這是正常操作那~(委屈.jpg)
?
那么以后,就把各種情況都考慮好了再寫。自己把測試用例想完善,測試好了再提交~
也會像某Kevin說的,每一次的錯誤都記錄一下,比如沒考慮到哪種情況等等。
?
高精度第二題:
題目:給出兩個正整數A和B,計算A+B的值。保證A和B的位數不超過500位。
輸入描述:
讀入兩個用空格隔開的正整數
輸出描述:
輸出A+B的值
樣例輸入:
3 12
樣例輸出:
15
數據范圍及提示:
兩個正整數的位數不超過500位
我的答案:
這題看似和上面一樣,其實不太一樣。
emmm
其實也一樣。
?
這題出現了兩個錯誤
1.同位的兩個數相加小于10的情況下忘了將記錄進位數的temp置0。導致接下來會加上了上一次的進位位。
2.這是加法,兩個加數地位一樣,假如兩個數的位數不同,不能只考慮前面的數比后面的長這種情況,還要考慮后面的比前面的長。
?
代碼:
#include <iostream> #include <string.h> using namespace std; void pluss(char a[],char b[],int alen,int blen) {int c[10000];int arear=alen-1;int brear=blen-1;int i=0,temp=0;int flag=0;while(arear>=0 && brear>=0){if((temp+a[arear]-'0'+b[brear]-'0')<10){c[flag++]=a[arear]-'0'+b[brear]-'0'+temp;temp=0;}else{c[flag++]=(a[arear]-'0'+b[brear]-'0'+temp)%10;temp=(a[arear]-'0'+b[brear]-'0'+temp)/10;}arear--;brear--;}while(arear>=0){if((temp+a[arear]-'0')<10){c[flag++]=a[arear]-'0'+temp;temp=0;}else{c[flag++]=(a[arear]-'0'+temp)%10;temp=(a[arear]-'0'+temp)/10;}arear--;}while(brear>=0){if((temp+b[brear]-'0')<10){c[flag++]=b[brear]-'0'+temp;temp=0;}else{c[flag++]=(b[brear]-'0'+temp)%10;temp=(b[brear]-'0'+temp)/10;}brear--;}if(temp!=0) c[flag]=temp;else flag--;for(i=flag;i>=0;i--){cout<<c[i];} } int main() {char a[500];char b[500]; cin>>a>>b;int alen=0,blen=0;alen=strlen(a);blen=strlen(b);pluss(a,b,alen,blen);return 0; }高精度第三題:
題目:
給出兩個正整數A和B,計算A*B的值。保證A和B的位數不超過500位。
輸入描述:
讀入兩個用空格隔開的正整數
輸出描述:
輸出A*B的值
樣例輸入:
3 12
樣例輸出:
36
數據范圍及提示:
兩個正整數的位數不超過500位
我的答案:
這個和前兩題還是有差別的。
想了很久,一直在糾結怎么循環,才能把進位,當前的乘積加在一起。
就是沒觀察出來可以先加再進位這種方法。
Kevin大神果然還是強強的。
我還是太嫩了。。。
自己還是沒抓到本質吧,主要是沒想到先都加進c里,再統一進位這種辦法。
積累經驗吧。
Kevin說得對,任何題目都是這樣,想一下假如人算的話,怎么做,然后應用到電腦上,然后利用算法和數據結構優化時間和空間復雜度。
就算是要模擬,也不能一模一樣的蠻干。有腦子就要學會轉彎,學會轉彎就是能夠優化。
下面是Kevin大神教給我的代碼:
(不到50行,干干凈凈的解決了問題,越來越覺得他真的好厲害。。。)
(學習的越多越覺得他棒棒。突然覺得我得好好努力,不然連大佬有多厲害都不知道)
#include <iostream> #include <string.h> using namespace std; int c[1000000];void multip(char a[],char b[],int alen,int blen) {int i=0,j=0,k=0;for(i=alen-1;i>=0;i--){for(j=blen-1;j>=0;j--){c[alen-1-i+blen-1-j]+=(a[i]-'0')*(b[j]-'0');}}for(k=0;k<alen+blen;k++){c[k+1]=c[k+1]+c[k]/10;c[k]=c[k]%10;}while(c[k]==0){k--;}for(i=k;i>=0;i--){cout<<c[i];} } int main() {char a[500];char b[500]; cin>>a>>b;int alen=0,blen=0;alen=strlen(a);blen=strlen(b);multip(a,b,alen,blen);return 0; }原來Kevin真的有每天看我這種小弱雞的博客。。。
突然緊臟。。。
?
怪不得昨晚夢見慌慌亂亂的參加考試。。。
? ? ? ? ? ? ?? ? ? ? ? ?
加油內~
?
?
?
?
?
?
?
總結
- 上一篇: 双系统启动项设置为上次所选系统
- 下一篇: Mediawiki 使用