Live2D

P1010 幂次方

题目描述

任何一个正整数都可以用 \(2\) 的幂次方表示。例如

\(137 = 2^7+2^3+2^0\)

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

由此可知,$ 137 $ 可表示为:

\(2(7)+2(3)+2(0)\)

进一步:

\(7 = 2^2 + 2 + 2^0\)

(\(2^7\)\(2\) 表示),并且

\(3=2+2^0\)

所以最后$ 137 $可表示为:

\(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+1\)

所以 \(1315\) 最后可表示为:

\(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)\)

输入输出格式

输入格式:

一个正整数\(n\)(\(n≤20000\))

输出格式:

符合约定的 \(n\)\(0,2\) 表示(在表示中不能有空格)

输入输出样例

输入样例#1:

1315

输出样例#1:

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

分析

分治法递归求解

关于找最大幂 可以用公式 \(floor(log(n)/log(2))\) 也可以循环移位找

要注意 2 的处理 加法的位置

代码

#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 @ 2019-04-12 12:36  Duiliur  阅读(514)  评论(0编辑  收藏  举报