zoukankan      html  css  js  c++  java
  • 解题报告——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;}

  • 相关阅读:
    学习ESLint的规则配置,ESLint语法检测配置说明
    慎用Request.Params获取参数值
    [C#.NET 拾遗补漏]04:你必须知道的反射
    .NET Web应用中为什么要使用async/await异步编程
    Asp.Net Core Web Api 使用 Swagger 生成 api 说明文档
    网页打印尺寸设置
    Object 标签遮挡 Div 显示
    C# 之 批量插入数据到 SQLServer 中
    PrintDocument打印、预览、打印机设置和打印属性的方法
    JS 之 阻止事件冒泡,阻止默认事件,event.stopPropagation()和event.preventDefault(),return false的区别
  • 原文地址:https://www.cnblogs.com/caotongyu/p/5926347.html
Copyright © 2011-2022 走看看