链接:登录—专业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);
}