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