这一题先把顺序仔细观察一下,可以发现顺序就是n^0, n^1, n^0 + n^1, n ^ 2, n ^ 0 + n ^2….之类的数据,仔细观察能够发现顺序就是先输出n^i次方,再把所有的n^0 ~ n^i-1 和n^i进行相加。
嘿嘿,这题我倒是很自豪,发现了数学方法,仔细观察下,就可以发现第m个数字就是,n ^ log 2 (m) + n ^ log 2(m – 2 ^ log 2 (m)) + ….直到n^0为止,嘿嘿,代码如下:
C语言:
#include <stdio.h>
#include <math.h>
int pow_(int num, int x)
{
if(x == 0){
return 1;
}
if(x == 1){
return num;
}
if(x & 1){
return pow_(num * num, x / 2) * num;
}else{
return pow_(num * num, x / 2);
}
}
int main(void)
{
unsigned ans = 0;
int i, t;
int m, n;
scanf(%d%d, &m, &n);
while(n != 0){
t = log2(n);
ans += pow_(m, t);
n -= pow_(2, t);
}
printf(%u\\n, ans);
return 0;
}
这题有一个更好的解法,思路是完全的,但是不需要使用log2函数,直接使用位运算,感谢七妹的代码!
#include <stdio.h>
**int** main(**void**)
{
**unsigned** i, j;
**unsigned** k, n;
**unsigned** ans = 0, t;
scanf(%u%u, &k, &n);
t = 1;
/* 注意, 从1开始 */
**while**(n){
**if**(n & 1){
ans += t;
}
n >>= 1;
t *= k;
}
printf(%d\\n, ans);
**return** 0;
}