解题报告——2018级2016第二学期第四周作业
题目:
描述
任何一个正整数都可以用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≤20000)
输出
符合约定的n的0,2表示(在表示中不能有空格)。
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
分析:
这题可以用一个函数;
输入的是操作是(当前的数m);
因为输出的是一个式子,所以我们可以用string定义一个ans;
这样最终返回ans;
通过理解题目发现在操作数为0或1或2时,幂是不用再次分解的;
所以每次我们特别分类;
如果不是1,2,0,那么又会出现两种情况,一种m/2为偶数,便可以继续/2(因为这时不必分解),但如果是奇数,便一定要分解一个出来;
所以在其中我们可以用a数组来来表示/2是否是奇数;
这时也有两种情况
1.(i==js-1)[js为数组最终的数】【为数组标号】,那前面是没有+好的;所以ans=ans+”2(“+work(i)+”)”;
2.(i!=js-1)则是有+好的;
但要注意的是如果i是等于1的那是中间不用再操作,直接+“+2”或“2”;
这样最终返回ans;
代码:
#include<iostream>#include <cstdio>#include <cmath>#include <string>#include<cstring>#include <vector>#include <algorithm>
using namespace std;
int n;
string work(int m){//注意返回的是string类型
string ans="";//定义ans
int a[20],js=0;
memset(a,0,sizeof(a));//注意归零
if (m==0) ans="0";
else if (m==2) ans="2";//是否进一步操作判断
else {
while (m>0) {
a[js++]=m%2;
m/=2;
}//奇偶判断
for (int i=js-1;i>=0;i--)
if (a[i]!=0){//是否是尾
if (i!=1){
if (i==js-1) ans=ans+"2("+work(i)+")";
else ans=ans+"+2("+work(i)+")";//是否要有+好判断
}
else {
if (i==js-1) ans=ans+"2";
else ans=ans+"+2";//连接式子
}
}
}
return ans;}
int main(){
cin>>n;//输入
cout<<work(n)<<endl;//输出
return 0;}