1 题目描述
任何一个正整数都可以用 2的幂次方表示。例如 137=2^7+2^3+2^0。
同时约定方次用括号来表示,即 a^b可表示为 a(b)。
由此可知,137 可表示为 2(7)+2(3)+2(0)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。输入的绝对值不超出10^9输出描述
符合约定的 n的 0, 2 表示(在表示中不能有空格)。2解题
- 这个题其实很简单,典型的需要使用递归的题目,首先是二进制表示,然后如果指数比2大,在输出这个这个指数的时候把它再进行二进制表示,不断嵌套直到<=2(不能再拆分)
- 处理指数的时候完全可以当做一个新的数来操作,情形一模一样,直接调用前面的函数就行
- 图示
- 注意:
最后一个不为0的项后面不要再输出+号
程序处理完在最后记得输出一个换行符 - 代码
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
void print(int a[],int i);
void powexpression(int n);
void print(int a[],int i){
int j=0;
while(!a[j]) //找到第一个不是0的元素下标
j++;
while(i--){ //判断完就会减1
if(i==j){
if(i>2&&a[i]!=0){
cout<<"2(";
powexpression(i);
cout<<")";
}
else if(i==1&&a[i]!=0)
cout<<2;
else if(a[i]){
cout<<"2("<<i<<')';
}
break;
}
else{
if(i>2&&a[i]!=0){
cout<<"2(";
powexpression(i);
cout<<")+";
}
else if(i==1&&a[i]!=0)
cout<<2<<'+';
else if(a[i]){
cout<<"2("<<i<<')'<<'+';
}
}
}
}
void powexpression(int n){
int a[100];
int i=0;
while(n){
a[i++]=n%2;
n/=2;
}
print(a,i);
}
int main(){
int n;
// freopen("file out.txt","r",stdin);
cin>>n;
powexpression(n);
cout<<endl;
return 0;
}
- 完美AC