zoukankan      html  css  js  c++  java
  • 蓝桥杯 幂方分解

    问题描述
      任何一个正整数都可以用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表示(在表示中不能有空格)
    题目分析:这道题,没什么技巧,就是一道模拟题吧,很容易看到,就是将一个数按照(2,0)两个数的格式输出,递归实现。
    需要注意一点,当输出2的时候千万不要输出2(2(0)),这样形成累赘,虽然也是对的,但就与原答案不符合了。
    贴上代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 int mi[15]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384};
     4 int zs[15]={1,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
     5 void f(int n)
     6 {
     7     if(n==1){printf("2(0)");return ;}
     8     if(n==2) {printf("2");return ;}
     9     int i=14,j=n;
    10     while(i>=1){
    11         if(j-mi[i]>=0){
    12             printf("2");
    13             if(zs[i]>1){
    14                 printf("(");
    15                 f(zs[i]);
    16                 printf(")");
    17             }
    18             j-=mi[i];
    19             if(j) printf("+");
    20             f(j);return ;
    21         }
    22         i--;
    23     }
    24 }
    25 int main()
    26 {
    27     int n;scanf("%d",&n);
    28     f(n); printf("
    ");
    29     return 0;
    30 }
    View Code
  • 相关阅读:
    Mat类具体解释(二)
    Android NDK开发篇(六):Java与原生代码通信(异常处理)
    Redis源代码剖析--对象object
    NioEventLoopGroup源码分析与线程设定
    零拷贝剖析以及用户空间与内核空间切换
    Java 字符集编码
    NIO网络编程
    NIO网络访问模式实践
    Spring Boot使用Html
    内存映射文件MappedByteBuffer和Buffer的Scattering与Gathering
  • 原文地址:https://www.cnblogs.com/bokezhilu/p/3607116.html
Copyright © 2011-2022 走看看