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  } 

 

posted @ 2018-11-30 20:50  AloneGhost  阅读(244)  评论(0编辑  收藏  举报