描述
任何一个正整数都可以用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(2(2)+2+2(0))+2(2+2(0))+2(0)
我的代码 WA
#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<map> #define DEBUG(x) cout << #x << " = " << x << endl const int MIN=0x80000000; using namespace std; int getBit(int n,int i) { return (n>>i)&1; } void change(int n) { if(n==0){ printf("0"); return; } int t=n; int cnt=0; for(int i=0;t;i++){ int b=getBit(n,i); t=t<<1; if(b){ if((31-i)==2){ printf("2"); return; } else { printf("2("); change(31-i); printf(")+"); cnt++; } } } //DEBUG(cnt); } int main() { freopen("in.txt","r",stdin); int n; cin>>n; change(n); return 0; }
参考代码
#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<map> #define DEBUG(x) cout << #x << " = " << x << endl using namespace std; int getBit(int n,int i) { return (n>>i)&1; } void change(int n) { bool first=true; for(int i=15; i>=0; i--) { if(getBit(n,i)) { if(!first){ printf("+"); } else first=false; if(i==0) { printf("2(0)"); } else if(i==1) { printf("2"); } else { printf("2("); change(i); printf(")"); } } } } int main() { // freopen("in.txt","r",stdin); int n; cin>>n; change(n); return 0; }
方向对了,但是怎么也得不到正确的代码,主要是编程思维不够成熟。从上面两份代码,就可以看出来。