题目描述
题目链接:数根__牛客网
数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,那么这个数就是数根;如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。
比如,对于24 来说,把2 和4 相加得到6,由于6 是一位数,因此6 是24 的数根。
再比如39,把3 和9 加起来得到12,由于12 不是一位数,因此还得把1 和2 加起来,最后得到3,这是一个一位数,因此3 是39 的数根。
现在给你一个正整数,输出它的数根。
输入描述:
输入包含多组数据。 每组数据数据包含一个正整数n(1≤n≤10E1000)。
输出描述:
对应每一组数据,输出该正整数的数根。
示例1
输入
24 39 输出 6 3
题目理解:
给一个数,把它的各个位上的数依次加起来,如果大于9,那就继续加它的各个位上的数,直到最终和 是一个 个位数。用例是多组输入。题目要求就这些,没什么难的。
解题思想:
根据题意,就把各个位上的数加起来,那我们怎么做呢,循环除10,再求余10,依次取到 个位数,十位数,进行相加,这个思路也是可以的。但是既然不区分个位十位百位等,只是把每位上数相加,可以用 字符串做,通过 字符串拿字符思想,依次让它们相加。按道理,多位相加,最后结果肯定是大于9的,这时候就要继续让这个大于9的各个位上的数相加,然后如果还大于9 ,就继续相加,也就是说,这是个 双重循环(外层循环 确保最终 数字字符串只有一位,内层循环不断相加当前数字字符串的每一位)。 但是这里有个取巧思想,就是 我们计算数字能发现,任何一个大于 9的两位数,它的个位数和十位数相加,结果肯定是 小于10的,以最大的 9+9 =18 ,大于10,只需要单独给它处理一下,让 1+8 =9,然后用这个9 去加后面的数字就好了,如果不大于9,就继续往后加,不用处理。
说到这里,这道题也就说完了,就是注意一个事,前面说的 用数字去做,做不了,可以看后台给的用例,这也是这道题比较坑的地方。
可以看到 第100,101,102 的用例输入,这都不知道多少位了,用整数根本通不过!
// write your code here
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
String num = scan.next();
long root = num.charAt(0)-'0';
for(int i=1;i<num.length();i++){
if(num.length()<2){
break;
}
root +=(num.charAt(i)-'0');
// 如果大于 9 ,就给它单独处理一下,把数字处理为 字符串
if(root >9){
String tmp = new String(root+"");
root = (tmp.charAt(0)-'0')+(tmp.charAt(1)-'0');
}
}
System.out.println(root);
}
}
}