【算法设计与分析】—— 任何正整数都可以用2的幂次方表示

任何正整数都可以用2的幂次方表示

算法题目

在这里插入图片描述

  • 输出从大到小,在括号里只允许用0和2表示,即总共有这三种形式:2(0),2,2(2),其余的都通过进一步分解成为这种形式,这势必要涉及到递归。

算法分析

  • 当时看到这个写的非常简洁,有点不太懂,就自己按照这个思路在纸上演示了几个

  • 比如7,7=2(2)+2+2(0),那么按照这个算法,调用(7,0),得到(3,1),7%2=1,所以后期会输出2(0),得到(1,2),3%2=1,所以后期会输出2(1),最后n=1时会输出2(2),再一步步回溯,即可得到2(2)+2+2(0),其他的以此类推

  • 当时的想法就是,如果起始是奇数的话,肯定有2(0),如果进行一次除以2操作后,得到的是奇数的话,肯定就会涉及两部分中的另一部分不完整,所以加上2的m次方

  • 最后为了满足题意,需要控制输出,这里使用switch语句,需要注意case语句后面不要漏掉break,我当时还在纠结default后面跟了多条语句要不要加花括号,最后发现不加也没有错误

在这里插入图片描述
在这里插入图片描述

代码实现

#include<stdio.h>

void f(int n,int m)
{
    if(n==1)
    {
        switch(m)
        {
            case 0:printf("2(0)");
                   break;
            case 1:printf("2");
                   break;
            case 2:printf("2(2)");
                   break;
            default:printf("2(");
                    f(m,0);
                    printf(")");
                    break;
        }
    }
    else
    {
        f(n/2,m+1);

        if(n%2==1)
        {
            switch(m)
            {
                case 0:printf("+2(0)");
                       break;
                case 1:printf("+2");
                       break;
                case 2:printf("+2(2)");
                       break;
                default:printf("+2(");
                       f(m,0);
                       printf(")");
                       break;
            }
        }
    }
}

int main()
{
    int n;
    printf("请输入一个正整数n:\n");
    scanf("%d",&n);

    if(n<1||n>20000)
        printf("ERROR INPUT!\n");
    else
        f(n,0);

    return 0;
}

结果示例

  • 示例一
    在这里插入图片描述
  • 示例二
    在这里插入图片描述
  • 示例三
    在这里插入图片描述
原创文章 54 获赞 73 访问量 9529

猜你喜欢

转载自blog.csdn.net/qq_43779149/article/details/106087706