C 函数,它将数字拆分然后求和

C 函数,它将数字拆分然后求和,c,function,split,sum,digits,C,Function,Split,Sum,Digits,我正试图解决一个需要我记下数字的问题。使用%和/取最右边的数字,并对分隔的数字求和。然后告诉我这个数字是否可以被9整除 我创建了一个函数,将最右边的数字分隔开,然后我尝试获取该数字并通过while循环运行它。存在的问题是,当我运行while循环时。它会创建一个无限循环,否则将无法打印输出 #include <stdio.h> int loopnum(int n); int main(void) { int num; int sum = 0; int d =

我正试图解决一个需要我记下数字的问题。使用%和/取最右边的数字,并对分隔的数字求和。然后告诉我这个数字是否可以被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;
}
#包括
intloopnum(intn);
内部主(空)
{
int-num;
整数和=0;
int d=loopnum(num);
printf(“输入一个数字:\n”);
scanf(“%d”和&num);
while(loopnum(num)>0){
printf(“d=%d”,d);
printf(“,sum=%d\n”,sum);
}
如果(数值%9==0){
printf(“n=%d可被9整除”,num);
}
否则{
printf(“n=%d不能被9整除”,num);
}
返回0;
}
int loopnum(int n)
{
n=n%10;
n=n/10;
返回n;
}
输入一个数字: 9 n=9可被9整除 此代码的结果假定为输出d=“数字”,总和= “数字+总和”和n=“数字”可被9整除。例如,如果我
输入9。输出将是d=9,sum=9。

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

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
的指针

比如:

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;
}

这个函数没有意义

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);
}
既不更改
num
,也不更改
d
,也不更改
sum

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

如果没有该函数,程序可以按以下方式运行

#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;
}

num
从不在while循环中更改。而且
num
也从不初始化
int d=loopnum(num)您正在按值传递数字。因此,函数中所做的更改不会反映在调用函数中。您应该使用指针。您永远不会更改
num
,那么您希望
loopnum(num)
什么时候更改?我希望loopnum(num)在while循环中运行并提取数字,然后对数字求和。我注意到while循环中缺少一行求和的数字。
#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