找到数字的数字根

时间:2014-03-09 18:57:35

标签: c++ math numbers acm

这是一个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;
    }
}
你能帮帮我吗?! 谢谢。

9 个答案:

答案 0 :(得分:2)

问题是输入整数大于无符号long long的整数。

因此,您需要将数字作为字符串读取,然后从字符串中计算数字和。

以下代码可以使用:

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

答案 1 :(得分:1)

我想知道为什么有人还没发布这个......:P 该函数返回答案:)

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

答案 2 :(得分:0)

可能问题在于该数字可能包含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;
}

答案 3 :(得分: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;

答案 4 :(得分:0)

该任务确实要求除以9的余数。

原因:自10 mod 9 == 1以及10^k mod 9 == 1以来,十进制数字的总和具有与数字本身相同的余数除以9。重复的数字和不会改变余数,因此某些n的十进制数字根与n mod 9相同或计算n模9的数字和。

将riklund的代码减少到这个基本任务给出了

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

答案 5 :(得分: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";
    }
}

答案 6 :(得分: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;

}

答案 7 :(得分: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;
}

答案 8 :(得分:-1)

它在main()中使用简单的副本,对不起我的英语。

int a = 39;
int b = 0;

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

}
while (a > 9);