c - 对平方数字求和时是否需要明确处理负数或零?

标签 c

我最近在类进行了一次测试。其中一个问题如下:

Given a number n, write a function in C/C++ that returns the sum of the digits of the number squared. (The following is important). The range of n is [ -(10^7), 10^7 ]. Example: If n = 123, your function should return 14 (1^2 + 2^2 + 3^2 = 14).

这是我写的函数:

int sum_of_digits_squared(int n) 
{
    int s = 0, c;

    while (n) {
        c = n % 10;
        s += (c * c);
        n /= 10;
    }

    return s;
}

对我来说很正确。所以现在考试回来了,我发现老师没有给我全部打分,原因我也不懂。据他说,为了使我的功能完整,我应该添加以下细节:

int sum_of_digits_squared(int n) 
 {
    int s = 0, c;

    if (n == 0) {      //
        return 0;      //
    }                  //
                       // THIS APPARENTLY SHOULD'VE 
    if (n < 0) {       // BEEN IN THE FUNCTION FOR IT
        n = n * (-1);  // TO BE CORRECT
    }                  //

    while (n) {
        c = n % 10;
        s += (c * c);
        n /= 10;
    }

    return s;
}

这个论点是数字 n 在 [-(10^7), 10^7] 范围内,所以它可以是负数。但是我看不到我自己的函数版本在哪里失败。如果我没理解错的话,while(n)的意思就是while(n != 0)not while (n > 0),所以在我的函数版本中,数字 n 不会进入循环失败。它的工作原理是一样的。

然后,我在家里的电脑上尝试了该函数的两个版本,我尝试的所有示例都得到了完全相同的答案。因此,sum_of_digits_squared(-123) 等于 sum_of_digits_squared(123)(再次等于 14)(即使没有详细说明我显然应该添加)。实际上,如果我尝试在屏幕上打印数字的数字(重要性从小到大),在 123 的情况下,我得到 3 2 1 而在-123 案例我得到 -3 -2 -1 (这实际上有点有趣)。但在这个问题中,这无关紧要,因为我们对数字进行了平方。

那么,谁错了?

编辑:我的错,我忘了具体说明并且不知道这很重要。我们的类(class)和测试中使用的 C 版本必须是 C99 或更新。所以我猜想(通过阅读评论)我的版本会以任何方式得到正确答案。

最佳答案

总结评论中的讨论:

  • 没有充分理由提前测试 n == 0 . while(n)测试将完美地处理这种情况。
  • 很可能你的老师还习惯于以前的时代,当 % 的结果出现时负操作数的定义不同。在一些旧系统上(包括,值得注意的是,PDP-11 上的早期 Unix,Dennis Ritchie 最初是在该系统上开发 C 的),a % b 的结果总是[0 .. b-1] 范围内,这意味着 -123 % 10 是 7。在这样的系统上,预先测试 n < 0将是必要的。

但是第二个项目符号仅适用于较早的时间。在 C 和 C++ 标准的当前版本中,整数除法被定义为向 0 截断,所以结果是 n % 10保证给你 n 的最后一位(可能是负数)即使n是负的。

因此while(n) 的含义是什么?” 问题的答案是“与while(n != 0) 完全相同”,而< em>“此代码对负数和正数 n 都能正常工作吗?” 是“是的,在任何符合标准的现代编译器下。” 问题的答案 < em>“那为什么讲师把它记下来了?” 可能是他们不知道 1999 年 C 语言和 2010 年左右 C++ 发生的重大语言重新定义。

关于c - 对平方数字求和时是否需要明确处理负数或零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58224638/

相关文章:

c - linux C编程获取Client IP总是获取0.0.0.0

将数据从文本文件复制到另一个

javascript - 将数据从网页传输到服务器c程序

无法将参数 'LPCWSTR {aka const wchar_t*}' 转换为 'const char*' 到 '1'

c - C中带符号数的数组索引

c - 无法从 OpenGL 3.2/3.3 检索版本信息

c - 使用 pcap 示例编程

c - 如何理解条件表达式、赋值表达式和常量表达式的语法?

c - 如何从 atmega32 引脚读取输入值?

c - 如何在c中聚合字符串数组