P1010 幂次方

来源:互联网 发布:spring boot 端口 编辑:程序博客网 时间:2024/05/16 19:06

题目描述

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

TJ1:
一开始想到递归,然后就开始写,发现写出来是9=2(0)+2(2(0)+2)这种形式,从低位到高位写的。

//9=2(0)+2(2(0)+2)#include<iostream>#include<cstdio>using namespace std;void f(int n){    int b=0;    while(n)    {        if(n&1)        {            switch(b)            {                case 1:cout<<2;break;                case 0:cout<<2<<"("<<0<<")";break;                case 2:cout<<2<<"("<<2<<")";break;                default: cout<<"2(";f(b);cout<<")";             }            if(n>1) cout<<"+";        }        n>>=1;//第二次写成了n>>1,不给n赋值         b++;    }}int main(){    int n;cin>>n;f(n);}

后来知道需要用到二进制转换来写:

//9=2(2+2(0)+)+2(0)+怎么把最后的+去掉 //一开始想的往后面加if(j)cout<<"+";,后来想到往每个加数的前面加"+",后来又想到简单的加“+”方法,至此AC。 #include<iostream>#include<cstdio>#include<cstring>using namespace std;void f(int n){    int i=0,bt[20];memset(bt,0,sizeof bt);    while(n){bt[i++]=n%2;n/=2;}    i--;     for(int j=i;j>=0;j--)    {        if(bt[j])        {            if(j<i)cout<<"+";//KEY            switch(j)            {                        case 1:cout<<2;break;                case 0:cout<<2<<"("<<0<<")";                case 2:cout<<2<<"("<<2<<")";break;                default: cout<<"2(";f(j);cout<<")";                 }        }    }}int main(){    int n;cin>>n;f(n);}
0 0
原创粉丝点击