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 }