解题报告——2018级2016第二学期第四周作业 (2的幂次方)

 解题报告——2018级2016第二学期第四周作业

题目:

描述

任何一个正整数都可以用2的幂次方表示。例如:137=27+23+20

   同时约定方次用括号来表示,即ab 可表示为a(b)。

    由此可知,137可表示为:2(7)+2(3)+2(0)

   进一步:7= 22+2+20   (212表示)

            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

通过理解题目发现在操作数为012时,幂是不用再次分解的;

所以每次我们特别分类;

如果不是12,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;}

原文地址:https://www.cnblogs.com/caotongyu/p/5926347.html