我最近在班上参加了一次考试.其中一个问题是:

给定一个数字n,用C/C++编写一个函数,返回数字squared的数字之和.(以下内容很重要).百分之range是[-(10^7),10^7].示例:如果n=123,函数应该返回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)notwhile (n > 0),因此在我的函数版本中,数字n不会不进入循环.它也会起同样的作用.

然后,我在家里的电脑上try 了这两个版本的函数,我try 的所有例子都得到了完全相同的答案.因此,sum_of_digits_squared(-123)等于sum_of_digits_squared(123)(同样,等于14)(即使没有我显然应该添加的细节).事实上,如果我try 在屏幕上打印数字的数字(从最小到最大),在123种情况下,我得到3 2 1,在-123种情况下,我得到-3 -2 -1(这实际上有点有趣).但在这个问题中,这并不重要,因为我们将数字平方.

那么,谁错了?

EDIT:我的错,我忘了具体说明,不知道它很重要.在我们的课堂和测试中使用的C版本必须是C99或newer.所以我猜(通过阅读 comments )我的版本无论如何都会得到正确的答案.

推荐答案

总结 comments 中不断渗透的讨论:

  • 没有充分的理由提前测试n == 0次.while(n)测试将完美地处理这种情况.
  • 很可能你的老师仍然习惯于早期,当%个负操作数的结果有不同的定义时.在一些旧系统上(尤其包括PDP-11上的早期Unix,Dennis Ritchie最初在那里开发了C),a % b的结果是[0 .. b-1]范围内的always,这意味着-123%10是7.在这样一个系统上,有必要提前对n < 0进行测试.

但第二点只适用于早期.在C和C++标准的当前版本中,整数除法被定义为截断为0,因此结果证明n % 10保证即使在n为负时也可以给n(可能是负)最后一个数字.

所以问题"What is the meaning of 100?"的答案是"Exactly the same as 101",而问题"Will this code work properly for negative as well as positive 102?"的答案是"Yes, under any modern, Standards-conforming compiler.",问题"Then why did the instructor mark it down?"的答案可能是他们没有意识到在1999年的C语言和2010年左右的C++语言中发生的重大的语言重新定义.

C++相关问答推荐

你能用自己的地址声明一个C指针吗?

在C++中头文件中声明外部 struct

Win32API Wizzard97 PropSheet_SetWizButton不工作

可以将C变量限制为特定的读/写速度吗?

为什么STM32G474RE上没有启用RCC PLL

为什么该函数不将参数值保存到数据 struct 中?

平均程序编译,但结果不好

用gcc-msse 2编译的C程序包含AVX 1指令

如何用c语言修改shadow文件hash部分(编程)?

<;unistd.h>;和<;sys/unistd.h>;之间有什么区别?

如何仅使用软件重新初始化STM32微控制器中的USB枚举?

MacOS下C++的无阻塞键盘阅读

仅从限制指针参数声明推断非混叠

为四维数组中的Dim-1和Dim-3重新分配空间

表达式x&;&;(~x)应该返回1还是0?它依赖于编译器吗?

Linux Posix消息队列

`%%的sscanf无法按预期工作

C中2个数字的加法 - 简单的人类方法

程序打印一些随机空行

GDB 跳过动态加载器代码