我必须编写一个函数,它接受一个int数作为参数并将其打印到终端,但是有一个问题:我只能使用从glibc写入的函数。我是一个初学者,我怎样才能在不变得复杂的情况下改进这段代码?顺便说一句,标题太长了,因为我不能用更短的标题来发布。
#include <stdio.h>
void ft_putchar(char c)
{
write(1, &c, 1);
}
int power(int num, int exp)
{
int n = num;
int i = 0;
for (i = 0; i < exp-1; ++i)
{
n = n*num;
}
if (exp == 0)
return 1;
return n;
}
void ft_putnbr(int nb)
{
int n = nb;
int i = 0;
while (n != 0)
{
++i;
n = n/10;
}
for (i = i-1; i >= 0; --i)
{
ft_putchar((nb/power(10, i))%10 + '0');
}
}
main()
{
ft_putnbr(1234);
}
第一个需要改进的候选函数是power()
。
- 如果
exp
参数为0,你的函数应该立即返回1,没有不必要的计算,循环等。可以通过将if
指令移到函数的开头来实现。或者,您可以使用1
作为n
的起始值并扩展循环来消除这种检查,如下所示:
int power(int num, int exp)
{
int n = 1;
for (int i = 0; i < exp; ++i)
{
n = n * num;
}
return n;
}
- 下一件事是,您只使用
10
的功率,所以通过参数传递它是不必要的。只需将函数重命名为power10()
并仅传递指数:
int power10(int exp)
{
int n = 1;
int i = 0;
for (i = 0; i < exp; ++i)
{
n = n * 10;
}
return n;
}
void ft_putnbr(int nb)
{
....
for (i = i - 1; i >= 0; --i)
{
ft_putchar((nb / power10(i)) % 10 + '0');
}
}
- ,或者如果你想要更多的"generic"
power()
函数,您应该添加检查0
的数字(在这种情况下,0
的值应该返回,而不管指数),并为负指数(0
的值也应该返回): - 最后,如果您想加快代码的速度,您应该重新考虑将计算
10
的功率的调用替换为简单的静态功率数组,如下所示:
int power(int num, int exp)
{
if ((num == 0) || (exp < 0))
return 0;
int n = 1;
for (int i = 0; i < exp; ++i)
{
n = n * num;
}
return n;
}
static int power10[] = {1, 10, 100, 1000, 10000, 100000, 1000000,
10000000, 100000000, 1000000000};
....
void ft_putnbr(int nb)
{
....
for (i = i - 1; i >= 0; --i)
{
ft_putchar((nb / power10[i]) % 10 + '0');
}
}