hdu 1013 Digital Roots
The digital root of a positive integer is found by summing the digits of the integer. If the resulting value is a single digit then that digit is the digital root. If the resulting value contains two or more digits, those digits are summed and the process is repeated. This is continued as long as necessary to obtain a single digit.
For example, consider the positive integer 24. Adding the 2 and the 4 yields a value of 6. Since 6 is a single digit, 6 is the digital root of 24. Now consider the positive integer 39. Adding the 3 and the 9 yields 12. Since 12 is not a single digit, the process must be repeated. Adding the 1 and the 2 yeilds 3, a single digit and also the digital root of 39.
Input The input file will contain a list of positive integers, one per line. The end of the input will be indicated by an integer value of zero.
Output For each integer in the input, output its digital root on a separate line of the output.
Sample Input
24
39
0
Sample Output
6
3
思路:
先解释一下题目的意思:
对于一个多位数,将其每一位数字相加,如果相加的和还是多位,则继续执行,直到相加的和是一位数。
这题的思路很简单,就是将一个数分割求每位上的数之和,然后判断和是否为一位数。但是这个题目并未告诉这个多位数的大小,如果我们用 int 型来解此题,会出现 wrong answer ,如果用 long long 来解,照样过不了。所以,这题的解题关键就在于用数组将这个数保存起来,然后在求解。
代码实现及讲解:
#include<stdio.h>
#include <iostream>
#include <algorithm>
#include<string.h>
#include<math.h>
char n[100000]; //定义字符数组保存输入的数,不能用 int 数组,因为 int 数组 不能将一个数一步输入
using namespace std;
int main()
{
while (scanf("%s",n) != EOF && n[0] != '0')
{
int i;
while (n[1] != '\0') //循环的结束条件,应为最终只有一位,所以第二位为 \0
{
int sum = 0;
for (i=0;n[i] != '\0';i++) //分解求和
sum += n[i] - '0';
int k = 0;
memset(n,0,sizeof(n)); //注意这步不能少,少了就可能有问题,可能会出现死循环
while (sum) //将得到的和在次分割,放入字符数组中
{
n[k++] = sum % 10 + '0';
sum = sum / 10;
}
}
printf("%c\n",n[0]);
}
}
return 0;
}