hdu 3925 Substring(模拟)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3925


题目大意:给定一个大数a,和小数b,问a最少加上多少使得a中含有子串b。


解题思路:让b*1,b*10,b*100与a想减,对每次减的结果取最小值。


测试数据:

100
1340 134
123456 234
9 2
9999 111
10 11
4444 1111
9 1

代码

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;


int main()
{
	int n,arr[101],a,b,g;
	int t = 0,minn,i,j,k;
	char s1[101],s2[101];
	string str1,str2;
	
	
	cin>>n;
	while(n--){

		a = b = 0;
		cin>>s1>>s2;
		string str1(s1),str2(s2);
		int x = str1.size();
		int y = str2.size();
		if(str1.find(str2) < str1.size()){

			cout<<"Case #"<<++t<<": 0"<<endl;
			continue;
		}
		

		minn = 1000000000;
		if(x < y){
			
			a = atoi(s1),b = atoi(s2);
			cout<<"Case #"<<++t<<": "<<b-a<<endl;
		}
		else{

			str1 = "00" + str1;
			while(str2.size() <= x + 1){

				string s = str2;
				k = str2.size() - 1,g = x + 2;
				int len2 = str2.size();
				cout<<"s2 == "<<s<<endl;

				for(i = x + 1; i > x + 1 - len2; --i) {
					
					--g;
					if(str2[k] - str1[i] < 0 ) {

						arr[g] = (str2[k] - '0') + 10 - (str1[i] - '0');
						if (k - 1 >= 0) str2[k-1]--;
					}
					else arr[g] = str2[k] - str1[i];
					k--;
					if(k == -1) break;
				}
				

				while(arr[g] == 0) g++;
				if( x - g < 8){

					int tminn=0;
					for(i = g; i <= x + 1; i++)
						tminn = tminn * 10 + arr[i];
					if(minn > tminn)
						minn = tminn;
				}
				str2 = s + '0';
			}
			cout<<"Case #"<<++t<<": "<<minn<<endl;
		}
	}	
}

本文章ZeroClock原创,但可以转载,因为我们是兄弟。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值