P1010 幂次方

洛谷团队希望加入!
题目描述
任何一个正整数都可以用 22 的幂次方表示。例如 137=27+23+2^0137=2
7
+2
3
+2
0

同时约定方次用括号来表示,即 a^ba
b
可表示为 a(b)a(b)。

由此可知,137137 可表示为 2(7)+2(3)+2(0)2(7)+2(3)+2(0)

进一步:

7= 22+2+207=2
2
+2+2
0
( 2^12
1
用 22 表示),并且 3=2+2^03=2+2
0

所以最后 137137 可表示为 2(2(2)+2+2(0))+2(2+2(0))+2(0)2(2(2)+2+2(0))+2(2+2(0))+2(0)。

又如 1315=2^{10} +2^8 +2^5 +2+11315=2
10
+2
8
+2
5
+2+1

所以 13151315 最后可表示为 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)。

输入格式
一行一个正整数 nn。

输出格式
符合约定的 nn 的 0,20,2 表示(在表示中不能有空格)。

输入输出样例
输入 #1复制
1315
输出 #1复制
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
说明/提示
对于 100%100% 的数据,1\le n\le 2\times 10^41≤n≤2×10
4

#include<iostream>
#include<cmath>

using namespace std;

void fun(int n){
 	if(n==1){
		cout<<"2(0)";
 	}else if(n==2){
 		cout<<"2";
 	}else if(n==4){
 		cout<<"2(2)";
 	}else{
		int a;
		while(1){
			if(n==0){
				break;
			}else if(n==1||n==2||n==4){
				fun(n);
				break;
			}else{
				a = floor(log(n)/log(2));

				if(a==1){
					cout<<"2";
				}else{
					cout<<"2(";
				    fun(a);
				    cout<<")";
				}
				if(n-pow(2,a)){cout<<"+";}	
			}
			   n = n-pow(2,a);						
		}
	}
}

int main(){
	int n;
	cin>>n;
	fun(n);
	return 0;
}
posted @ 2020-10-02 14:26  xmcword  阅读(335)  评论(0编辑  收藏  举报