В общем случае функция numberDigits
неверна, поскольку для числа, равного 0, функция возвращает 0 цифр.
Массив digits
является избыточным.
В общем случае введенная строка может начинаться с «0». Таким образом, условие while l oop неверно.
Из назначения неясно, считается ли 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;
}
Вывод программы может выглядеть следующим образом
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.