解题思路:
(1)观察序列:30,31,30+31,32,30+32,31+32,30+31+32,…
(2)发现可以写成:30*1,31*1+30*0,31*1+30*1,32*1+31*0+30*0,32*1+31*0+30*1,32*1+31*1+30*0,32*1+31*1+30*1,…
(3)对于数列中的每一个数,都可以表示为一系列3m*(1 or 0)的形式。
(4)多项式中的1和0提取出来,就是1,10,11,100,101,110,111,…即原数列中数的位置的二进制表示,第1个数对应1,第2个数对应10,第3个数对应11,……
(5)至于指数 m ,它的大小是和二进制的位数有关的,最低位对应 m = 0,之后随着位数递增。
(6)理解了数列的表示方式,就可以写出底数为 k 的数列的第 N 项了,就是把 N 写成二进制,每位乘以对应的 k 的方幂,再求和就得到了结果。
注意事项:
(1)int k, N, res, order; 这句编译时会把除了 order 以外的变量初始化为0,而 order 初始化为51,必须在定义时就初始化 order = 0 才行,我无法理解。
(2)求方幂用 pow() 函数的话会报答案错误,只能写成用 for 循环累乘的形式,我没开会员所以不知道为啥错了。
参考代码:
// 题目 1105: 数列 #include <iostream> #include <cmath> using namespace std; int main() { int k, N; cin >> k >> N; int res = 0; // 最后结果 int order = 0; // 数位,代表幂,从 0 开始 while (N) { if(N % 2 == 1) { // res += pow(k, order); //用 pow() 会报答案错误??? int temp = 1; for (int i = 0; i < order; ++i) { temp *= k; } res += temp; // 如果二进制N的最低位是1,则加上对应的数字 } N /= 2; // 舍去最低位 ++order; // 位数+1 } cout << res << endl; return 0; }
0.0分
7 人评分
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:568 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:669 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:552 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:896 |
求圆的面积 (C语言代码)浏览:1266 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:532 |
【偶数求和】 (C语言代码)浏览:638 |
C语言训练-大、小写问题 (C语言代码)浏览:611 |
求组合数 (C语言代码)浏览:1152 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1138 |