解题思路:
变量描述:n代表s=a+aa+aaa+aaaa+aa...a中的a,cycle表示aa...a的位数(有多少个a),tmp表示每位数的和,tmpc表示有多少位(描述不清请看下面的例子)
思路:最终结果的位数不会超过2*cycle位,所以我们用一个长度为2*cycle的整型数组来保存结果,数组每一位初始化为0。
你要做的就是把循环计算把tmp的每一位累加到数组的相应位置。
举一个简单的例子:求2+22+222+2222时,我们并不依次累加求和,而是具体到每一位相加
2 | 2 | 2 | 2 |
2 | 2 | 2 | |
2 | 2 | ||
2 |
我们计算n=4*2+3*2+2*2+1*2,cycle=4,这就是一个由cycle决定循环次数的循环相加过程。其中tmpc就从4递减到1,tmp则是tmpc*n(这里n为2)。
接下来,要将每次tmp的每一位放到数组里,比如tmp=4*2=8,那么arr[i]应加8;若tmp=5*3=15,那么arr[i]应加15%10=5,arr[i-1]应加15/10=5(相加进位)。这也是一个一步步累加的过程。
循环后顺序输出不为0的数组元素就是我们要的答案了。
注意事项:
提示:自己举个简单的例子理解方法,这道题轻松解决~
参考代码:
#include<stdio.h> int main(void) { int n, cycle, i, j, tmp, tmpc; scanf("%d%d", &n, &cycle); int arr[2*cycle]; tmpc = cycle; for(i=0; i<2*cycle; i++){ arr[i] = 0; } for(i=2*cycle-1; i>=0 && tmpc>0; i--){ tmp = tmpc*n; j = i; while(tmp != 0){ arr[j]+=tmp%10; if(arr[j]>9){ arr[j-1]+=arr[j] / 10; arr[j] = arr[j] % 10; } tmp/=10; j--; } tmpc--; } for(i=i+1; i<2*cycle; i++){ printf("%d", arr[i]); } return 0; }
结果截图:
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复