Vijos P1597 2的幂次方【进制+递归】
描述
任何一个正整数都可以用2的幂次方表示。
同时约定用括号来表示方次,即a的b次,可以表示为a(b).
由此可知,137可以表示为:
2(7)+2(3)+2(0)
进一步:
7=2(2)+2+2(0)(2的1次用2表示)
3=2+2(0)
所以137可以表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
按2的次幂降次排列。
格式
输入格式
正整数n(n<=20000)
输出格式
用0,2表示符合约定的n(在表格中不能有空格)。
样例1
样例输入1
137
样例输出1
2(2(2)+2+2(0))+2(2+2(0))+2(0)
限制
1S
来源
NOIP 1998
问题链接: Vijos P1597 2的幂次方
问题分析:
这是一个进制转换问题,用递归程序实现是方便的。
程序说明:
函数convert(int n, int e)实现n的e次方转换为其2的幂次方表示。
这个程序是先前做的,直接拿过来用,参见参考链接。
进制是常见的话题,递归程序到处可见。
参考链接:CCF NOI1074 2的幂次方表示
AC的C程序如下:
#include <stdio.h> #define BASE 2 void convert(int n, int e) { int digit, quotient; if(e == 0) { if(n == 0) ; else if( n == 1) printf("2(0)"); else if(n == 2) printf("2"); else { convert(n / BASE, e+1); digit = n % BASE; if(digit) { printf("+"); convert(digit, e); } } } else { quotient = n / BASE; digit = n % BASE; if(quotient > 0) { convert(quotient, e+1); if(digit) printf("+"); } if(digit) { if(e == 1) printf("2"); else { printf("2("); convert(e, 0); printf(")"); } } } } int main(void) { int n; scanf("%d", &n); convert(n, 0); printf("\n"); return 0; } /* 12345 2(2(2+2(0))+2(2)+2(0))+2(2(2+2(0))+2(2))+2(2(2)+2(0))+2(2(2))+2(2+2(0))+2(0) */