解题思路:

(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.0分

5 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

小游 1年前 回复TA
pow函数是需要浮点参数的,所以定义的时候一般需要浮点型。
整型的话是会报错的,所以应该是这个原因。