版权声明:IT交流QQ群328880248,欢迎大家来一起学习一起交流~本篇文章未经同意请勿转载! https://blog.csdn.net/m0_38072683/article/details/87901632
算法训练 幂方分解
时间限制:1.0s 内存限制:256.0MB
问题描述
任何一个正整数都可以用2的幂次方表示。例如:
137=27+23+20
同时约定方次用括号来表示,即ab 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 22+2+20 (21用2表示)
3=2+20
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=210 +28 +25 +2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
输入包含一个正整数N(N<=20000),为要求分解的整数。
输出格式
程序输出包含一行字符串,为符合约定的n的0,2表示(在表示中不能有空格)
思路
深搜,将n的二进制从最高位开始移位,判断是否是1,如果是1,那就准备好递归。
这个题有点坑啊,题目上的括号是中文的`(`,我复制的,提交,直接WA了,一个点都没过。后来换成英文括号A了。
代码
#include<cstdio>
using namespace std;
void solve(int n) {
if (n == 0 || n == 2) {
printf("%d",n);
return ;
}
bool flag = true;
for (int i = 31; i >= 0; i--) {
if (n>>i & 1) {
if (flag) {
flag = false;
} else {
printf("+");
}
if(i == 1){
printf("2");
continue;
}
printf("2(");
solve(i);
printf(")");
}
}
}
int main() {
int n;
scanf("%d",&n);
solve(n);
return 0;
}