hdu 1013 Digital Roots

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值