首页 > 解决方案 > 以 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;
}

我到这里并计算最高指数,不知道下一步在哪里?这是我的拼贴实验室,通常不要在这里问,所以请尽量慢一点。

标签: cfunctionmath

解决方案


您的任务是从基数 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_FAILUREexitstdlib.h;中声明 或者,一个简单的面无表情return;就可以了。

其他一些观察:

  • trenutnirez未初始化且未使用;
  • 通常,当您写入标准输出时,您希望附加一个换行符,这意味着附加\n到您printf的格式字符串,或者简单地使用puts,这将自动为您完成;
  • 考虑在顶部声明所有函数原型:这很有用,因为当您有多个函数时,您不必担心哪个函数先出现,以便所有函数在所有函数中都“可见”(例如,如果您现在在下面添加求幂函数foo,顺便说一下,您应该将其重命名为更合适的名称,它不会知道新函数的签名)。

推荐阅读