对上面各位的程序做了下测试,没有一个完全正确的,仔细看了下soft_wind的,觉得写得比较好,但是存在2个问题:一个是对1的处理不当,题目要求[QUOTE](2)单独一个1写成2(0)的形式,指数上的1则不用写成这样的形式;[/QUOTE],而soft_wind一律当成2(0)处理,另一个问题是int log2(int)函数,返回的值和预想的不一致,比如log2(8)应该返回3,但实际上返回的是2,这就造成了num=8时,结果为2(2(1))+2(2(1))的情况。
针对这2个问题,我对soft_wind的程序做了下修改,测试中还没发现问题:
[CODE]#include <math.h>
char c='+'; //全局变量,用来保存数字1前面的那个符号
int log2(int num)
{
return (int)(log10(num)/log10(2));
}
void func(int num)
{
int trans;
if(num==1){
if(c=='+') //增加对1的判断
printf("2(0)");
else printf("1");
}
else if(num==2)printf("2(1)");
else {
printf("2(");
c='(';
func(log2(num));
printf(")");
trans=num-(int)pow(2,log2(num));
if(trans>0){
printf("+");
c='+';
func(trans);
}
}
}
void main()
{
int num;
start:
scanf("%d",&num);
func(num);
goto start;
getch();
}[/CODE]
测试结果:
1
2(0)
2
2(1)
3
2(1)+2(0)
4
2(2(1))
5
2(2(1))+2(0)
6
2(2(1))+2(1)
7
2(2(1))+2(1)+2(0)
8
2(2(1)+2(0))
9
2(2(1)+2(0))+2(0)
10
2(2(1)+2(0))+2(1)
11
2(2(1)+2(0))+2(1)+2(0)
12
2(2(1)+2(0))+2(2(1))
13
2(2(1)+2(0))+2(2(1))+2(0)
14
2(2(1)+2(0))+2(2(1))+2(1)
15
2(2(1)+2(0))+2(2(1))+2(1)+2(0)
16
2(2(2(1)))
17
2(2(2(1)))+2(0)
18
2(2(2(1)))+2(1)
19
2(2(2(1)))+2(1)+2(0)
20
2(2(2(1)))+2(2(1))
21
2(2(2(1)))+2(2(1))+2(0)
22
2(2(2(1)))+2(2(1))+2(1)
23
2(2(2(1)))+2(2(1))+2(1)+2(0)
24
2(2(2(1)))+2(2(1)+2(0))
25
2(2(2(1)))+2(2(1)+2(0))+2(0)
26
2(2(2(1)))+2(2(1)+2(0))+2(1)
27
2(2(2(1)))+2(2(1)+2(0))+2(1)+2(0)
28
2(2(2(1)))+2(2(1)+2(0))+2(2(1))
29
2(2(2(1)))+2(2(1)+2(0))+2(2(1))+2(0)
30
2(2(2(1)))+2(2(1)+2(0))+2(2(1))+2(1)
31
2(2(2(1)))+2(2(1)+2(0))+2(2(1))+2(1)+2(0)
64
2(2(2(1))+2(1))
97
2(2(2(1))+2(1))+2(2(2(1))+2(0))+2(0)
[此贴子已经被作者于2006-8-12 4:23:32编辑过]