hdu 1013 Digital Roots

杭电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);
        }
        
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值