洛谷P1010幂次方

来源:互联网 发布:求五轴磨床编程软件 编辑:程序博客网 时间:2024/06/05 11:23

任何一个正整数都可以用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^1用2表示)

    3=2+2^0   

所以最后137可表示为:

    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)

输入输出格式

输入格式:

一个正整数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)









题解:从题目得知,137=2^7+2^3+2^0=128+8+1;

                  128=2^7=2^(2^2+2^1+2^0);

                  8=2^3=2^(2^1+2^0);

                  1=2^0;

                  137=2^(2^2+2^1+2^0)+2^(2^1+2^0)+2^0;

所以只要找到一个比2大的数进行分解,最后输出。

pascal code

var n:longint;proceduref(x:longint);var a:array[0..20] of longint; //存放二进制下的状态(用于分解)i,l:longint; first:boolean;beginl:=-1; //从2^0开始计算while x>0do//十进制转二进制begininc(l);a[l]:=x mod2;x:=x div2;end;first:=true;for i:=l downto 0doif a[i]=1 then //当二进制的那一位为一,处理一次beginif first then first:=false //处理一次elsewrite('+'); //已经处理了一次,第二次还要加。if i=0thenwrite('2(0)') //2^0的情况elseif i=1thenwrite(2) //2^1的情况else beginwrite('2(');f(i); //递归write(')');end;end;end;beginreadln(n);f(n); //递归end.

c++ code

#include using namespace std;void f(int x){bool a[21];//存放二进制下的状态(用于分解)bool first;int i,l;  l=-1;//从2^0开始计算  while (x>0){//十进制转二进制  l++;  a[l]=x%2;  x/=2;  }  first=1;  for (i=l;i>=0;i--){  if (a[i]==1) {//当二进制的那一位为一,处理一次  if (first==1) first=0;//处理一次     else printf("+");//已经处理了一次,第二次还要加。     if (i==0) printf("2(0)");//2^0的情况   else if (i==1) printf("2"); //2^1的情况   else{    printf("2(");    f(i);    printf(")");   }}  }}int main(){int n;scanf("%d",&n);f(n); //递归return 0;}


原创粉丝点击