1. 程式人生 > >Introspection——The second blog.

Introspection——The second blog.

       

  A1(薄弱知識點): 數學思維&邏輯不強,總是找不到規律,像新手賽中,那道摺紙飛機的題目,不知道它的計算規律什麼。

  A2(有挑戰性的題):cpp-練習7中的程式設計題第二題:數列求和-加強版;

解題報告:

1)題目大意:先輸入一個數字a(1~9),然後再輸入一個n(有n個數);這n個數中,第一項只有一個數字a,第二項開始,每一項比前一項多一個數字a,直到第n項(第n項有n個數字a);輸出為這n個數之和。

2)解題思路:首先很自然地想到定義一個int型陣列來存放這n個數,然後再定義一個sum來存放這n個數的和,但是,在一定條件下,這個數之和會遠遠大於int型資料的範圍(爆int)。所以為了避免爆int,只需要將最後的總和sum的每一位上的數拆出來輸出,即一次只輸出一個數字。

3)程式碼思路:先從n個數的個位數開始計算(+加法|*乘法),將進位暫存入ahead變數,將最後的個位數放入陣列a[0]中;之後將n-1個數的十位數進行計算並加上ahead將進位暫存入ahead變數,將最後的個位數放入陣列a[1]中;其他位數以此類推。(每高一個位數,該位數上的數字數量都會比前一位少1,存在同一規律,用for/while迴圈為佳)

4)核心技術總結:Emmmmmmmm...把握好每一位的進位。

5)解題過程中存在的問題:1、測試點0格式錯誤(即N=0時);2、每一個位數的存放順序;

解決:1、N=0時,只輸出0,沒有其他輸出(換行符也不行);2、個人習慣,問題不大;

 1
#include<iostream> 2 using namespace std; 3 int main() 4 { 5 int A,N; 6 cin>>A>>N; 7 if(N==0) cout<<0; //坑,N=0時,竟然不需要輸出換行符; 8 9 int a[N]; 10 int j=0,i,ahead=0;//j是陣列的下標,ahead為進位值(0,1,2,3,...,n); 11 //通過觀察可知,每一位數上的數量都會比低一位數的數量少一; 12 for(i=N;i>=1
;i--){ 13 a[j++]=(i*A+ahead)%10; /*效果:將最後的數按位數分解,按位數從低到高,逆序存值; 14 其實就是 將N個數,從最低位開始相加; */ 15 ahead=(i*A+ahead)/10; //暫存每一次進位後的數值(0,1,2,3,...,n); 16 } 17 if(ahead>0) cout<<ahead; //for迴圈結束後,若仍有進位,則優先輸出該進位值:1,2,3,...,n; 18 for(j=j-1;j>=0;j--) //將陣列逆序輸出即將最終結果(和)從高位向低位輸出; 19 cout<<a[j]; 20 cout<<endl; 21 //若將數列的所有數相加和sum,則一定值的A,N會使輸出的sum爆int; 22 return 0; 23 }