【问题标题】:function that splits digits then sums them拆分数字然后对它们求和的函数
【发布时间】:2019-11-01 01:08:54
【问题描述】:

我正在尝试解决一个需要我输入数字的问题。使用 % 和 / 取最右边的数字并将分开的数字相加。然后判断这个数是否能被 9 整除。

我创建了一个函数来分隔最右边的数字,然后我尝试获取该数字并通过 while 循环运行它。存在的问题是,当我运行 while 循环时。它会创建一个无限循环,否则将不会打印输出。

#include <stdio.h>

int loopnum(int n);

int main(void)
{
    int num;
    int sum = 0;
    int d = loopnum(num);

    printf("Enter a number:\n");
    scanf("%d", &num);

    while (loopnum(num) > 0) {
        printf("d = %d", d);
        printf(",sum = %d\n", sum);
    }

    if (num % 9 == 0) {
        printf("n = %d is divisible by 9\n", num);
    }
    else {
        printf("n = %d is not divisible by 9\n", num);
    }
    return 0;
}

int loopnum(int n)
{
    n = n % 10;
    n = n / 10;
    return n;
}
输入一个数字: 9 n = 9 可以被 9 整除

此代码的结果假设输出 d = "the digit" ,sum = "digit + sum" 和 n = "digit" 可以被 9 整除。例如,如果我 输入 9。输出将是 d = 9,sum = 9。

【问题讨论】:

  • num 在你的 while 循环中永远不会改变。
  • 另外,num 永远不会为 int d = loopnum(num); 初始化
  • 您正在按值传递数字。因此函数中所做的更改不会反映在调用函数中。你应该使用指针。
  • 你从未改变过num,那么你预计loopnum(num) 什么时候会改变?
  • 我预计 loopnum(num) 会运行 while 循环并提取数字然后对数字求和。我注意到 while 循环中缺少对数字求和的行。

标签: c function split sum digits


【解决方案1】:

函数没有意义。

int loopnum(int n)
{
    n = n % 10;
    n = n / 10;
    return n;
}

例如 n 等于 27 你会得到

n = n % 10;

现在n 等于7 然后

n = n / 10;

现在n 等于0

所以对于数字27,函数返回0

而且在循环内部

while (loopnum(num) > 0) {
    printf("d = %d", d);
    printf(",sum = %d\n", sum);
}

numdsum 均未更改。

定义这样一个函数没有什么意义,只是它本身可以输出中间的和和数字。

如果没有这个函数,程序可以如下所示。

#include <stdio.h>

int main(void) 
{
    while ( 1 )
    {
        const unsigned int Base    = 10;
        const unsigned int DIVISOR = 9;

        printf( "Enter a non-negative number (0 - exit): " );

        unsigned int n;

        if ( scanf( "%u", &n ) != 1 || n == 0 ) break;

        unsigned int sum = 0;

        unsigned int tmp = n; 
        do
        {
            unsigned int digit = tmp % Base;
            sum += digit;

            printf( "d = %u, sum = %u\n", digit, sum );
        } while ( tmp /= Base );

        printf( "\nn = %u is %sdivisble by %u.\n\n", 
                 n, 
                 sum % DIVISOR == 0 ? "" : "not ", DIVISOR );

    }

    return 0;
}

它的输出可能看起来像

Enter a non-negative number (0 - exit): 9
d = 9, sum = 9

n = 9 is divisble by 9.

Enter a non-negative number (0 - exit): 123456
d = 6, sum = 6
d = 5, sum = 11
d = 4, sum = 15
d = 3, sum = 18
d = 2, sum = 20
d = 1, sum = 21

n = 123456 is not divisble by 9.

Enter a non-negative number (0 - exit): 0

【讨论】:

    【解决方案2】:

    loopnum 代码错误。它总是返回零,因此while 不会循环。

    int loopnum(int n)
    {
        n = n % 10;  // After this n is a number between 0 and 9
        n = n / 10;  // Consequently, when you divide by 10 you'll end up with zero
        return n;
    }
    

    你的设计需要两件事:

    1) 返回余数

    2) 改变 n

    为此,您需要将指针传递给n

    类似:

    int loopnum(int *n)
    {
        int res = *n % 10; 
        *n = *n / 10;
        return res;
    }
    
    int main(void)
    {
      int x = 123;
      int sum = 0;
      while(x) sum += loopnum(&x);
      printf("%d\n", sum);
      return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多