问题描述
任何一个正整数都可以用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表示(在表示中不能有空格)
思路:我用的是递归,先把137用递归2(7)+2(3)+2(0)表达出来,先写简单的,在动态“2(x)”中的x再改成递归函数Fun(),这里的难度在于如何递归输出“+”,搞了我一上午的时间,最后还是发现,在x%2==0的时候,函数递归返回会少一个“+”,所以我用了一个计数器end,每当函数递归调用余数为0的函数时,end+1,但是end在每一层的数字都不一样,最后输出用flag>end来判断后面还有没有数字要加。其实也就是刚刚开始的第一个数如果是偶数,最后递归返回判断要不要加+时,如果余数为0的与余数不为0的相等,说明这一层是末尾,所以不用加+。
#include <bits/stdc++.h>
using namespace std;
void Fun(int x,int flag,int end){
if(x==0) return;
else if(x%2==1){
Fun(x/2,flag+1,end);
if(flag==0||flag==2){
cout<<"2("<<flag<<")";
}else if(flag==1){
cout<<"2";
}else{
cout<<"2(";Fun(flag,0,0);cout<<")";
}
if(flag>end)cout<<"+";
}else{
Fun(x/2,flag+1,end+1);
}
}
int main(){
int a;
cin>>a;
Fun(a,0,0);
return 0;
}