题目链接:http://code.hdu.edu.cn/game/entry/problem/show.php?chapterid=1§ionid=2&problemid=22
题目意思:给出一个数,观察其二进制表示,从右往左看,记录遇到第一个出现1的位置pos,做2 ^ pos 的运算。
这几天杭电的告示:Exercise Is Closed Now! 再加上想用一些简单的题目来调剂一下,因此就做ACM Steps 吧。
用了递归的方法来做。
1 #include <iostream> 2 #include <math.h> // pow库函数的使用 3 using namespace std; 4 5 int cnt; 6 7 void cal(int n) 8 { 9 int flag = 0; 10 if (n == 0) 11 return; // 递归的出口,已计算完n的二进制表示 12 else 13 { 14 if (n % 2) // 从右往左数,第一次遇到1 15 { 16 printf("%.0lf\n", pow(2, cnt)); // 计算2^cnt 17 flag = 1; 18 19 } 20 else 21 cnt++; // 累计不为1的位置有多少个 22 if (flag) 23 return; // 一旦从右边发现1,递归结束,也是递归的出口 24 cal(n/2); 25 } 26 } 27 28 int main() 29 { 30 int a; 31 while (scanf("%d", &a) != EOF && a) 32 { 33 cnt = 0; 34 cal(a); 35 } 36 return 0; 37 }