杭电oj上的一道题,题目是找出一个数如12345的root,root定义为将这个数的每个位相加,如果和不是个位数则继续此过程,如数12345,第一遍相加1+2+3+4+5=15,不是个位数,继续1+5=6,为个位数,终止。
题目比较简单,但也花了1个小时ac。。。。才刚开始我是用递归的方法,每次对数的所有为进行相加,如果是个位数则输出,否则继续调用此过程。刚开始用的是int存输入的值,发现太小,后改为BigInteger,结果还是过不了,我估计因为输入的数可能有1000多位,连BigInteger也存不了了?
后来我一次读入整行的数字,依次对每位进行加法,存到一个int型的变量,因为每位的值是在0-9之间,几个位的和也不过几万的值,int还是可以放下的,然后将此值进行迭代的操作,然后就ac了,下面是成功的ac代码
java:
package hdu.edu.acm;
import java.math.BigInteger;
import java.util.Scanner;
public class Problem1013Way2 {
/**
* author : luoyang
* 2013-4-12
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
String s=null;
while(input.hasNext())
{
s=input.nextLine();
int sum=0;
if(s.length()==1)
{
if(Integer.parseInt(s)==0)
{
break;
}
}
int l=s.length();
while(l-->0)
{
sum+=Integer.parseInt(s.substring(l, l+1));
}
System.out.println(getRoot(sum));
}
}
public static int getRoot(int n)
{
if(n<10)
return n;
else
{
int sum=0;
while(n>0)
{
int temp=n%10;;
sum+=temp;
n=n/10;
}
return getRoot(sum);
}
}
}
下面的是用BigInteger的wrong answer的代码,求人指点错误原因。。。
package hdu.edu.acm;
import java.math.BigInteger;
import java.util.Scanner;
public class Problem1013 {
/**
* author : luoyang 2013-4-12
*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
BigInteger n;
while(!(n=input.nextBigInteger()).equals(0))
{
System.out.println(getRoot(n));
}
}
public static int getRoot(BigInteger n)
{
if(n.compareTo(BigInteger.valueOf(10))<0)
return n.intValue();
else
{
BigInteger sum=BigInteger.valueOf(0);
while(n.compareTo(BigInteger.valueOf(0))>0)
{
BigInteger temp=n.mod(BigInteger.valueOf(10));
sum=sum.add(temp);
n=n.divide(BigInteger.valueOf(10));
}
return getRoot(sum);
}
}
}