在c中检查数字是否是9的倍数及其阶数为9

在c中检查数字是否是9的倍数及其阶数为9,c,function,recursion,definition,C,Function,Recursion,Definition,“确定整数N是否是9的倍数的一个众所周知的技巧是计算其数字的和S。如果S是9的倍数,那么N也是。此外,如果S中的位数是x,我们说9次是x” 条目是一个文件,因此每行包含一个正整数。包含数字0的一行表示结束 输入。条目中提供的数字最多为1000位 我针对此问题的代码: #include<stdio.h> long long int numberDigits(long long int value) { long long int i=0; if(value!=0){

“确定整数N是否是9的倍数的一个众所周知的技巧是计算其数字的和S。如果S是9的倍数,那么N也是。此外,如果S中的位数是x,我们说9次是x”

条目是一个文件,因此每行包含一个正整数。包含数字0的一行表示结束 输入。条目中提供的数字最多为1000位

我针对此问题的代码:

#include<stdio.h>

long long int numberDigits(long long int value)
{
   long long int i=0;
   if(value!=0){
        i++;
        return i+numberDigits(value/10);
    }
   else

        return 0;

}

int main(){

    char n[1001];
    n[0] = 1;
    long long int digits[1001], sumDigits = 0, i = 0;

    while (n[0] != '0')
    {

        scanf("%s", n);
        if(n[0] == '0')
            break;
        while(n[i])
        {
            digits[i] = (int)n[i] - 48;
            sumDigits += digits[i];
            i++;
        }
        if(sumDigits % 9 == 0)
            printf("%s is a multiple of 9 and has 9-degree %lld.\n", n, numberDigits(sumDigits));
        else
            printf("%s is not a multiple of 9.\n", n);
        sumDigits = 0;
        i = 0;
    }
    return 0;
}

#包括
长整数位数(长整数值)
{
长整型i=0;
如果(值!=0){
i++;
返回i+numberDigits(值/10);
}
其他的
返回0;
}
int main(){
charn[1001];
n[0]=1;
长整型数字[1001],总和数字=0,i=0;
而(n[0]!=“0”)
{
scanf(“%s”,n);
如果(n[0]=“0”)
打破
而(n[i])
{
数字[i]=(int)n[i]-48;
sumDigits+=数字[i];
i++;
}
如果(数字%9==0)
printf(“%s”是9的倍数,具有9度%lld。\n“,n,numberDigits(sumdights));
其他的
printf(“%s不是9的倍数。\n”,n);
sumdights=0;
i=0;
}
返回0;
}
我从电子法官那里得到了“错误的答案”。关于如何改进解决方案的任何提示?

您所要做的就是:

    i= 0; sumDigits= 0;
    while (n[i]) sumDigits += n[i++] - '0';

然后在循环之后,
i
具有位数。

通常,函数
numberDigits
是错误的,因为对于等于0的数字,函数返回0位数

数组
是冗余的

通常,输入的字符串可以从“0”开始。因此while循环的条件不正确

从赋值中不清楚0是否被视为可被9整除的有效数字

下面是一个演示程序,演示了如何实现该算法。我从有效数字中排除了0。如果允许由所有字符“0”组成的字符串,则替换此If语句

if ( sum != 0 && sum % Divisor == 0 )
为了这个

if ( sum % Divisor == 0 )
这是节目单

#include <stdio.h>

unsigned int numberDigits( unsigned long long int n )
{
    const unsigned int Base    = 10;

    return 1 +  ( ( n /= Base ) == 0 ? 0 : numberDigits( n ) );
}

int main(void) 
{
    enum { N = 1000 };
    char s[N + 1];

    while ( scanf( "%s", s ) == 1 && !( s[0] == '0' && s[1] == '\0' ) )
    {
        const unsigned int Divisor = 9;

        unsigned int sum = 0;

        for ( size_t i = 0; s[i] != '\0'; i++ )
        {
            sum += s[i] - '0'; 
        }


        if ( sum != 0 && sum % Divisor == 0 )
        {
            printf( "%s is a multiple of %u and has %u-degree %u.\n", 
                    s, Divisor, Divisor, numberDigits( sum ) );
        }
        else
        {
            printf( "%s is not a multiple of %u.\n", s, Divisor );
        }
    }

    return 0;
}

您必须使用递归吗?您正在使用
scanf
而不是数字读取字符串…如果测试抛出的不是数字的内容会使您感到不适,该怎么办?您说过该条目是一个文件,如果其中一个条目是
0123
,则会发生什么情况?n是一个字符数组。为什么要将n[0]设置为1?是否尝试过调试?这有点不正常,但是
i
sumdights
会重置,但会在主循环的末尾,而不是开始时重置
9 is a multiple of 9 and has 9-degree 1.
18 is a multiple of 9 and has 9-degree 1.
123456789 is a multiple of 9 and has 9-degree 2.
99999999999999999999 is a multiple of 9 and has 9-degree 3.