c - 以 k 的指数形式打印数字 n 的 C 函数,对于 2<=k<=16。EG for n=200 and k=8, print is "200=3*8**2+1*8**1"
问题描述
#include <stdio.h>
#include <math.h>
void foo (int n, int k){
int rez=1;
int trenutnirez;
int highest_exp=0;
if (k<2 || k>16){
printf ("INCORRECT");
return NULL;
}
while (rez<n){
rez*=k;
highest_exp++;
}
rez=n;
highest_exp--;
}
int main (){
foo(200,8);
return 0;
}
我到这里并计算最高指数,不知道下一步在哪里?这是我的拼贴实验室,通常不要在这里问,所以请尽量慢一点。
解决方案
您的任务是从基数 10 到其他基数(即基数 2 到基数 16)的数字转换。
本质上,
n = coef(xp) * b^(xp) + coef(xp-1) * b^(xp-1) + ... + coef(1) * b^(0) + coef(0) * b^(0)
其中以下是非负整数:
n
是给定的数字,coef(t)
表示索引为t的系数,b
是您要转换的基础,并且xp
是最高指数。
这样做的方法是通过重复的除法和余数运算。在伪代码中:
for i = xp to 0 inclusive:
coef = n / b**i // '/' is integer division, '**' is exponentiation
n = n % b**i // '%' is the remainder operation
if coef > 0:
if i != xp:
print " + "
endif
print coef, " * ", b, "**", i
endif
endfor
由此可以在 C 中完成一个相当简单的实现。请注意,您可能希望缓存的值,b**i
以便它不会被多次计算,并且您首先需要一个函数来执行计算(我建议您自己写一个)因为C不提供幂运算符,除了二进制数。
对您迄今为止编写的代码的一些评论:
- 不带任何参数
main
的函数的标准规定定义之一是——不要偏离这一点,除非你试图为你的特定实现调用一些实现定义的行为;int main(void) { ... }
- 从返回
NULL
类型为void
未定义行为的函数返回(来自 6.8.6.4,C99 标准):带有表达式的
return
语句不得出现在返回类型为 的函数中void
。- 您在这里想要的是
return EXIT_FAILURE;
(并更改函数返回的值的类型)并在调用函数或 call 中处理它exit(EXIT_FAILURE);
,这会导致正常的进程终止,EXIT_FAILURE
并exit
在stdlib.h
;中声明 或者,一个简单的面无表情return;
就可以了。
- 您在这里想要的是
其他一些观察:
trenutnirez
未初始化且未使用;- 通常,当您写入标准输出时,您希望附加一个换行符,这意味着附加
\n
到您printf
的格式字符串,或者简单地使用puts
,这将自动为您完成; - 考虑在顶部声明所有函数原型:这很有用,因为当您有多个函数时,您不必担心哪个函数先出现,以便所有函数在所有函数中都“可见”(例如,如果您现在在下面添加求幂函数
foo
,顺便说一下,您应该将其重命名为更合适的名称,它不会知道新函数的签名)。