程式設計題A+B Format的總結(第二次作業<一>)

whlzb發表於2016-02-01

Github連結地址:https://github.com/Startup-try/object-oriented
這個題目現在想想沒有那麼難,其實還挺簡單的,但是中午花了好長的時間還不懂得怎麼做,感覺要做出內傷。晚飯吃後,又查了一遍下午查資料沒搞懂的"03d"——輸出一個數,不足3位在前面補0,後面就比較順利地將這個題目解出來。
這個題目主要的難點是在輸出a+b的和的格式上,題目要求用標準形式輸出即當和值為4位及4位以上,從右邊往左每隔3位數要加個逗號,這是我在之前都沒做過的。最開始是以為C語言中有以標準形式輸出的函式,找了找,發現沒有。後面不知道怎麼下手就去網上看有沒有什麼方法,看到了班級同學是怎麼做的,大致看一下,沒有很細緻地去看,明白了用"%d,%d"這樣的形式就能按照題目的要求輸出標準形式,知道了是這樣子做後就自己動手去打程式碼。一開始的思路是第一個逗號前的數用c除以某個確切的數來得到,第一個逗號後的數用a除以某個確切的數+b除以某個確切的數得到,算得差點沒出內傷:一直錯,一直改,改了還是錯。敲得程式碼真的是又臭又長,總結原因,是自己演算法出了大問題。一開始寫的程式碼:

include<stdio.h>

int main()
{
int a,b,c,i=0,temp,a0,a1,a2,b0,b1,b2,t=0;
scanf("%d %d",&a,&b);
c=a+b;
if((c>0&&c<1000)||(c<0&&c>-1000))
printf("%d",c);
else if((c>1000&&c<1000000)||(c>-1000000&&c<-1000)){
c=c/1000;
a=a%1000;
b=b%1000;
if((a+b)%1000==0)
printf("%d,%d%d%d",c,t,t,t);
else if((a+b)%1000<100)
printf("%d,%d%d",c,t,(a+b)%1000);
else
printf("%d,%d",c,(a+b)%1000);
}
if((c>1000000&&c<3000000)||(c<-1000000&&c>-2000000)){
c=c/1000000;
a0=a;
a=a%1000;
a1=a;
a0=a0/1000;
a0=a0%1000;
a2=a0;
b0=b;
b=b%1000;
b1=b;
b0=b0/1000;
b0=b0%1000;
b2=b0;
if(((a2+b2)%1000==0)&&((a1+b1)%1000==0))
printf("%d,%d%d%d,%d%d%d",c,t,t,t,t,t,t);

else if(((a2+b2)%1000==0)&&((a1+b1)%1000<100))
printf("%d,%d%d%d,%d%d",c,t,t,t,t,(a1+b1)%1000);

else if(((a2+b2)%1000==0)&&((a1+b1)%1000>100))
printf("%d,%d%d%d,%d",c,t,t,t,(a1+b1)%1000);

else if(((a2+b2)%1000<100)&&((a1+b1)%1000>100))
printf("%d,%d%d,%d",c,t,(a2+b2)%1000,(a1+b1)%1000);

else if(((a2+b2)%1000<100)&&((a1+b1)%1000==0))
printf("%d,%d%d,%d%d%d",c,t,(a2+b2)%1000,t,t,t);

else if(((a2+b2)%1000<100)&&((a1+b1)%1000<100))
printf("%d,%d%d,%d%d",c,t,(a2+b2)%1000,t,(a1+b1)%1000);

else if(((a2+b2)%1000>100)&&((a1+b1)%1000==0))
printf("%d,%d,%d%d%d",c,(a2+b2)%1000,t,t,t);

else if(((a2+b2)%1000>100)&&((a1+b1)%1000<100))
printf("%d,%d,%d%d",c,(a2+b2)%1000,t,(a1+b1)%1000);

else
printf("%d,%d,%d",c,(a2+b2)%1000,(a1+b1)%1000);
}
return 0;
}
拿去裁判,一直是5分,6分。 程式設計題A+B Format的總結(第二次作業<一>)

飯後自己去查了資料,不知道怎麼就懂得用c除以某個確切的數來得到逗號前後各個數,而且很快就寫好了程式碼。但並不是一下子就全部正確,這中間也經歷了兩次提交的時候忘了把自己用於測試的程式碼刪掉,導致全部錯誤,最嚴重的是把可能為負數的情況忘了考慮。寫好了對於整數可行的程式碼,拿上去裁判,發現才得5分,覺得想不通,後面把示例拿去測試一下才發現忘了考慮結果為負數的情況,然後就去補上,拿去裁判,發現全部正確。好開心、好開心、好開心。忘了將測試程式碼刪了導致全部錯誤:程式設計題A+B Format的總結(第二次作業<一>)全部正確的:程式設計題A+B Format的總結(第二次作業<一>)

正確的程式碼:

include<stdio.h>

int main()
{
int a,b,c,t,i,j,m;
scanf("%d %d",&a,&b);
c=a+b;
t=i=j=m=c;
if((c>=0&&c<1000)||(c<=0&&c>-1000))
printf("%d",c);
else if((c>=1000&&c<1000000)||(c>-1000000&&c<=-1000)){
c/=1000;
t=t%1000;
if(t<0)
t=-t;
printf("%d,%03d",c,t);
}
else if((c>=1000000&&c<=2000000)||(c<=-1000000&&c>=-2000000)){
c/=1000000;
m%=1000000;
j=m/1000;
i%=1000;
if(j<0)
j=-j;
if(i<0)
i=-i;
printf("%d,%03d,%03d",c,j,i);
}
return 0;
}
總結:一開始還沒注意到a,b是整數,定義了double型別的a,b。這個考的知識點主要是“/”,“%”的用法。整數型別的a,/10^幾次方(小於a)就是幹掉後面幾位,%10^幾次方,就是保留後面幾位。 做完了這個題目覺得自己收穫還是蠻大的,不可否認,吃完晚飯後,頭腦有想過不懂得怎麼做就算了,後面自己還能做出來,感覺挺不錯的。還有,我想,可能並不是晚飯後就莫名其妙地知道怎麼做, 更有可能還是與中午大半天的琢磨有很大關係——就像吃前9個饅頭沒感覺飽等到第10個才覺得一樣,所以還是得多練!

相關文章