Найти цифровые корни числа

Это проблема ACM, чтобы найти корни целого числа.
Вот текст проблемы: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=115

Это мой код, но когда я отправляю код, я получаю неправильный ответ. С другой стороны, я проверяю этот код с помощью целых чисел и получаю правильный ответ.

#include <iostream>
using namespace std;
int main() {
unsigned long long cc = 0;
cin >> cc;
while (cc != 0) {
unsigned long long sum = 0;
while (cc > 0) {
sum += cc % 10;
cc = cc / 10;
if (cc == 0 && sum > 9) { cc = sum; sum = 0; }
}
cout << sum;
cin >> cc;
cout << endl;
}
}

Не могли бы вы мне помочь?!
Спасибо.

0

Решение

Проблема состоит в том, что входное целое число больше, чем то, которое поместится в длинном без знака.

Следовательно, вам нужно прочитать число в виде строки, а затем вычислить сумму цифр из строки.

Следующий код будет работать:

#include <iostream>
#include <string>
using namespace std;int main()
{
string inStr;
while(cin >> inStr && inStr != "0")
{
unsigned long long cc = 0;
for(string::const_iterator it = inStr.begin(); it!=inStr.end(); ++it)
{
cc += *it - '0';
}

unsigned long long sum = 0;
do
{
while (cc)
{
sum += cc % 10;
cc = cc / 10;
}
cc = sum;
sum = 0;
}while(cc > 9);

cout << cc << endl;
}
return 0;
}
2

Другие решения

Интересно, почему никто еще не опубликовал это …: P
функция возвращает ответ 🙂

int Digital_root(int a) {
return a%9==0 ? 9:a%9;
}
1

Возможно, проблема в том, что номер может содержать более 2 цифр, и в этом случае такая модификация необходима:

int main() {
unsigned long long cc = 0;
cin >> cc;
unsigned long long sum = 0;
while (cc > 0) {
sum += cc % 10;
cc = cc / 10;
if ( sum > 9) { cc = sum; sum = 0; }
^
// cc == 0 will fail
}
cout << sum;
}
0

Это не идеальный код, но может работать

int a = 0;
int b = 0;

while (true)
{
cout << endl << "a: ";
cin >> a;

if (!a) break;

do
{
while (a)
{
b += a%10;
a /= 10;
}
a = b;
b = 0;

}
while (a > 9);

cout << endl<< "root: " << a;
0

Задача действительно просит остаток от деления на 9.

Причина: с 10 mod 9 == 1 и, таким образом, также 10^k mod 9 == 1сумма десятичных цифр имеет тот же остаток при делении на 9, что и само число. Повторяющиеся суммы цифр не изменяют остаток, поэтому десятичный цифровой корень некоторых n такой же как n mod 9 или вычисление цифровой суммы n по модулю 9

Приведение кода риклунда к этой основной задаче дает

#include <iostream>
#include <string>
using namespace std;int main() {
string inStr;
while(cin >> inStr && inStr != "0") {
unsigned int cc = 0; // need only 5 bit for cc in this computation
for(string::const_iterator it = inStr.begin(); it!=inStr.end(); ++it) {
cc += *it - '0';
cc %=9;
}
cout << cc << endl;
}
return 0;
}
0
#include<iostream>
using namespace std;
int main()
{
for (int i = 0; ; i++)
{
unsigned long int x,sum=0;
cin >> x;

if (x == 0)
break;
if (x <= 9)
{
sum = x;
goto z;
}

while (x > 9)
{
while (x != 0)
{
sum = sum + (x%10);
x = x / 10;
}

if (sum > 9)
{
x = sum;
sum = 0;
}
}

z:
cout << sum <<"\n";
}
}
0
//digital roots.cpp~KAUSHIK
#include<iostream>
using namespace std;
int sum(int n)
{
int sum=0,r;

for (;n>0;)
{
r=n%10;
sum=sum+r;
n=n/10;

}
return sum;
}
int main()
{
int n;
cout<<"enter any number"<<endl;
cin>>n;
int a=n;
n=sum(n);
if((n/10)!=0)
{
n=sum(n);
cout<<"the digital root of "<<a<<" is"<<n;
}
else cout<<"the digital root of "<<a<<" is"<<n;

return 0;

}
0

это работает для маленьких целых чисел

#include <iostream>
using namespace std;

int main()
{
unsigned long long input;
while (true)
{
cin >> input;
if (input == 0) break;
input = input - (9 * ((input - 1) / 9));
cout << input << endl;
}
return 0;
}
0