跳至正文

数列 结题报告

  • OI路程

这一题先把顺序仔细观察一下,可以发现顺序就是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;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注