HDU 3925 Substring

http://acm.hdu.edu.cn/showproblem.php?pid=3925


给出a,b,问 :若sum=a+c,且b是sum的子串,那么 c 最小是多少

其中 a 很大(10^100)


一点一点模拟就可以了,用b从a的低位开始比较,然后b左移补零,依次扫描a的长度

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        BigInteger zero = BigInteger.valueOf(0);
        BigInteger ten = BigInteger.valueOf(10);
        int i,t,time=1;
        BigInteger a,b,min;
        t = cin.nextInt();
        while(t-->0){
            a=cin.nextBigInteger();
            b=cin.nextBigInteger();
            
            if(a.toString().indexOf(b.toString())!=-1){
            	min = zero;
            }
            else {
            	min = new BigInteger("999999999999999999999999999");
            	for(i=b.toString().length();i<=110;i++){
            		BigInteger temp1 = a.mod(ten.pow(i));
            		if(temp1.compareTo(b)==-1){
            			BigInteger temp2 = b.subtract(temp1);
            			if(temp2.compareTo(min)==-1){
            				min = temp2;
            			}
            		}
            		else if(temp1.compareTo(b)==0){
            			min = zero;break;
            		}
            		else {							//a>b的时候,可以考虑b前面补1,比如a=9,b=2
            			BigInteger bob = b.add(ten.pow(b.toString().length()));
            			BigInteger temp2 = bob.subtract(temp1);
            			if(temp2.compareTo(min)==-1 && temp2.compareTo(zero)!=-1){
            				min = temp2;
            			}
            		}
            		b = b.multiply(ten);
            	}
            }
            System.out.println("Case #"+time+": "+min);
            time++;
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值