[NOIP2006]数列

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

给定一个正整数k( 3 ≤ k ≤ 15 ),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k = 3时,这个序列是:
1,3,4,9,10,12,13,…(该序列实际上就是:3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,…)
请你求出这个序列的第N项的值(用10进制数表示)。例如,对于k = 3,N = 100,正确答案应该是 981。

输入描述:

输入1行,为2个正整数,用一个空格隔开:k N(k、N的含义与上述的问题描述一致,且3 ≤ k ≤ 15,10 ≤ N ≤ 1000 )。

输出描述:

输出一个正整数(在所有的测试数据中,结果均不超过2.1*109)。(整数前不要有空格和其他符号)。

示例1

输入

复制3 100

3 100

输出

复制981

981

分析

先对这题总的概括一下,就是找规律。直接上规律吧——

//输入正整数k,假设k的二进制有d位数字,则该数列的第n项为:

b1*k^(d-1) + b2*k^(d-2) + b3*k^(d-3) + ...bd*k^(d-d)。其中b1,b2...bd是k在二进制下的每位数字,要么是0要么是1。
//举例说明:
// 假设k=3,求第n=7项:首先求出n=7的二进制为111,显然d=3,那么套公式:
//1*3^2+1*3^1+1*3^0 = 9+3+1 = 13
//再假设k=3,求第n=3项:首先求出n=4的二进制为11,显然d=2,那么套公式:
//1*3^1+1*3^0 = 3+1 = 4
//再假设k=4,求第n=11项:首先求出n=11的二进制为1011,显然d=4,那么套公式:
//1*4^3+0*4^2+1*4^1+1*4^0 = 64+0+4+1= 69

看了这么多例子我想你已经会写这一题了。

完整代码:

#include<stdio.h>
#include<math.h>//下面用到pow函数
int dectobin(int* pnum, int n) {
	int i = 0;
	while (n) {
		*(pnum + i++) = n % 2;
		n /= 2;
	}
	return i;
	//这个返回值很重要,它记录了二进制n有几位数,
	//因为上面这种写法求出来的二进制数在数组中是倒着存放的,
	//比如11(dec)转成二进制是1011(bin),数组中就会倒着放成1101,必须借助这个返回值才能正确访问n的二进制各位数
}
int main()
{
	int k, n;
	scanf("%d%d", &k, &n);
	int num_bin[33] = { 0 };//这个数组用来存放二进制n中的各位数字,非0即1
	int digit = dectobin(num_bin, n);//digit接受函数返回值,记录了二进制n有几位数
	long long int sum = 0;//题目指出:在所有的测试数据中,结果均不超过2.1*10^9,因此sum变量必须长长整形,普通整形int会爆范围
	for (int i = digit - 1; i >= 0; i--) {
		sum += num_bin[i] * pow(k, i);//正常套公式就完了
	}
	printf("%lld", sum);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值