A B型別總結(較正式)

2021-07-04 22:16:03 字數 4154 閱讀 1495

a+b專題分析

a+b問題是acm程式設計的基礎,基石,雖說是基礎,是簡單題,但其實並不簡單,為什麼呢?因為它的要求正是對acm程式設計的基礎要求,只有這個能做的熟練,那麼,後邊牽扯到相應一些格式要求,甚至一些演算法思想都將不是問題。

下面,我將對其就我個人理解進行一下分析總結。

首先,剛接觸的最簡單的a+b型別就是很直接的直接輸出,如下例:

#include 

int main()

int a,b;

while(scanf("%d%d",&a,&b)!=eof)//實現多組資料輸入

printf("%d\n",a+b);//也可以在定義乙個變數,但個人認為這樣看起來簡潔,

return 0;

像這種最簡單的其實對於從未接觸過的我來說,也費了一番周折首先,是保證多組資料輸入,這個對我來說是新知識:它是以csanf結束符作為判斷依據的並將其作為while判斷條件,已達到對整個main函式的操控,就好比給主公加了個束縛,諫官的職責來對主上進行一定的約束,以使其更好為我們所用。

再深入一點就可以加一些結束標誌,比如對某乙個值的值:

#include 

int main()

int a,b;

while(scanf("%d",&a,&b)!=eof&&a!=0)

scanf("%d%d",&a,&b);

printf("%d\n",a+b);

return 0;

這裡不僅僅是簡單只有a+b了,而是有了對a的判斷,當a不為0是才執行,這裡還有一種表達方法就是while(scanf(「%d%d」,&a,&b)!=eof&&a);當然也可以以多個值比如....&&a&&b;就是以a,b都為零作為結束的。那麼這就是簡單的兩個數相加,接下來看一下連加的情況:

#include 

int main()

int a,b,sum=0,i;

while(scanf("%d",&a)!=eof&&a)

for(i=0;iscanf("%d",&b);

sum+=b;

printf("%d\n",sum);

sum=0;//加和類,或其他需要保持初值的 記得用完後一定賦初值;

return 0;

這裡就不單單是兩數加和了,而是連加,並以a==0為結束,這裡需要注意初始化,此例中我是用過後又重新賦值,當然也可以在用前進行初始化這樣就不用多寫這一行了,誠然這已經不錯,但是並不是任何時候我們都希望以乙個特殊值作為結束的,那麼有沒有一按回車就出答案,而且沒有結束特殊值的呢,,乙個偶然機會我找到了,其實也不能說是偶然,因為是在學習書本知識時發現的,下面給一下:

#include 

#include 

#include //呼叫stringstream

using namespace std;

int main()

string line;

while(getline(cin,line))//用getline讀取輸入的 字串流

int sum = 0,x;

stringstream ss(line);//建立新的字串流 ss 來儲存輸入的流;

while(ss >> x)//讀取字串流中的 整數x

sum += x;//進行加和

cout << sum << "\n";//輸出結果;

return 0;

這其中我已加了不少注釋,就不做詳細分析了(因為注釋中已經有了嗎),那麼介紹了這麼多,其實真正以應該重視的才要出現,就是格式控制,有人會說,這很容易啊!前面不才是重要嗎!其實前面的倒好說 基本沒問題因為那都是一些理解了就很容易寫出的,可是格式控制貫穿整個acm程式設計,我們隨時隨地都會見到,而且很容易出錯,變化相對也不少,所以應該引起重視。不可輕敵。常見的有答案間輸出空行(答案間),空格,開頭結尾就不能有:

#include 

int main()

int a,b,c,sum=0,i,j;

while(scanf("%d",&a)!=eof&&a)//輸入乙個數表示有多少組數需要計算,以0作為結束標誌;

for(i=0;iscanf("%d",&b);//每組數有b個數要相加;

for(j=0;jscanf("%d",&c);

sum+=c;//用sum表示資料的和;

printf("%d\n",sum);

if(iprintf("\n");

sum=0;//記得在每組數計算完成後 要對sum清零!!!!!這裡很好理解 卻經常會忘掉!!!!切記;

這是在多數相加基礎上做了延伸,然後又加了格式控制的介紹,分析,例中使用乙個條件判斷輸出空行的,其實還有簡單的方法,就是將最後乙個單獨輸出(這裡說的簡單是看起來而寫的行數卻不少,因為還是要判斷何時是最後乙個啊!)那就是

if(iprintf(「%d\n\n」,sum);

else

printf(「%d\n」,sum);

這樣其實就書寫來說並不少,但容易看懂,好理解。所以我說簡單。還有就是我在注釋中寫的,當然這些都是個人見到的進行總結,可能並不完備,也可能說得並不清楚,不明白,但我會繼續努力的,當我有能力之時,定將精細製作。

那說了這麼多,a+b型別其實已經差不多了,只是還有一些拓展了,比如當資料超出各種型別,那要怎麼辦呢!當時我第一反應是陣列,確實被我蒙對了,但寫著並不那麼輕鬆(至少我當時費了不少勁,可能是基礎太差吧!但那又有什麼關係呢?只要敢做 總有一天會克服的) 用陣列來寫,如下:

#include 

#include 

char a[1110000];

char b[1110000];

int aa[1110000];

int bb[1110000];

int max(int x,int y)//求兩者中大的數

int m;

if(x>=y)

m=x;

else

m=y;

return m;

int main()

int i,j,k,n;

while (scanf("%d",&n)!=eof)

for(k=1;k<=n;k++)

scanf("%s %s",a,b);

memset(aa,0,sizeof(aa));

memset(bb,0,sizeof(bb));//使用前先清空 是個好習慣

for(j=0,i=strlen(a)-1;i>=0;i--,j++)

aa[j]=a[i]-'0';//將字元型轉為數字,同時倒敘;

for(j=0,i=strlen(b)-1;i>=0;i--,j++)

bb[j]=b[i]-'0';

for(i=0;iaa[i]=aa[i]+bb[i];將和的結果放在aa裡;

if(aa[i]>=10)//判斷是否需要進製;

aa[i]%=10;

aa[i+1]+=1;

printf("case %d:\n",k);

printf("%s + %s = ",a,b);

if(aa[max(strlen(a),strlen(b))]==0)//判斷結果是否會多出一位

for(i=max(strlen(a),strlen(b))-1;i>=0;i--)

printf("%d",aa[i]);

else

for(i=max(strlen(a),strlen(b));i>=0;i--)//與上乙個for不同,此有最高位輸出。

printf("%d",aa[i]);//依次輸出;

printf("\n");

if(kprintf("\n");

這裡用的思想就是手算時的思想,倒敘相加,逢十進位思想(這不是我說的,是老師,學長說的,我總結),就是輸入字串形式,再倒敘轉化為int型(當然是逐位轉化),然後相加,判斷是否需要進製,最後再倒敘依次輸出(此時就是所需結果了),這裡還有乙個問題就是結果可能比原來陣列多一位(因為進製),例子中已經有判斷。

然後,這就接近尾聲了,在做乙個關於進製轉化的基礎加法題:

#include  

int main()

int a,b;

while(scanf("%x %x",&a,&b)!=eof)

printf("%d\n",a+b);

return 0;

就是輸入兩個16進製制數,相加後以10進製輸出,這裡用到了強制型別轉換,然後要做類似於前面的 連加,什麼的,就可以模仿寫出了。

本次,介紹到此結束。

謝謝!!!

A B 型別小結

a b問題說簡單也簡單,說麻煩確實也不簡單,這裡就我的一些理解做一些介紹,由於能力問題可能做得並不全面,也可能會有錯誤,或者不妥之處,希望各位見諒。1 a b中最簡單的就是輸入兩個數直接輸出結果,比如 include int main include int main return 0 這是用c 寫...

A B題庫總結

使用eof語句即可輸入多組資料,實現如下 while scanf d d a,b eof printf d n a b while scanf d d n,m 等效於 while scanf d d n,m eof 是按位取反的意思,scanf的返回值是其輸入值的個數,如果沒有輸入值就是返回 1,取...

非正式面試記錄總結

臨時抱佛腳絕對不是好的習慣,準備過程中一直是迷迷糊糊的,感覺自己很難深入理論,只是動手能力強一點而已。接下來記錄一下這次面試,昨晚帶了好多書回去,想著一晚把第二天可能要用到的知識吸收了 多麼天真的想法 結果都沒開啟過.正式面試前10分鐘 緊張的要死,明明知道必掛還是會緊張 面試內容 老師說了下面試環...