算法题目
- 输出从大到小,在括号里只允许用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;
}
结果示例
- 示例一
- 示例二
- 示例三