幂方分解(递归)

来源:互联网 发布:amt emulator mac 编辑:程序博客网 时间:2024/05/18 01:34

算法训练 幂方分解  
时间限制:1.0s   内存限制:256.0MB
      
问题描述
  任何一个正整数都可以用2的幂次方表示。例如:
  137=27+23+2
  同时约定方次用括号来表示,即ab 可表示为a(b)。
  由此可知,137可表示为:
  2(7)+2(3)+2(0)
  进一步:7= 22+2+2(21用2表示)
  3=2+2
  所以最后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表示(在表示中不能有空格)
我很喜欢这样的递归
# include <stdio.h>int c[16]={1,   2,   4,    8,    16,   32,   64,    128,           256, 512, 1024, 2048, 4096, 8192, 16384, 32768};void f(int n){    if (n==0)    {        printf("2(0)");        return ;    }       if (n==1)    {        printf("2");        return ;    }    if (n==2)    {        printf("2(2)");        return ;    }}       int fenJie(int n){    int h;    int i;    for (i=1; i<=15; i++)    {        if (n<c[i])        {            h = i;            break;        }    }    return h-1; }void digui(int n){       int t;    while (n)    {        t = fenJie(n);        if (t > 2)        {            printf("2(");            digui(t);        }           f(t);        n -= c[t];        if (n!=0 && t<=2)            printf("+");        if (t > 2)        {            if (n==0)                printf(")");                else                printf(")+");           }               }   }int main(){       int t;    int n;    scanf("%d", &n);    digui(n);            return 0;}



0 0
原创粉丝点击