题目意思是,给你提供两个数字 a 和 b

a 可以不断的往上加, 直到b 为其子串

问的是 a 最小加几?

显而易见,a  的数据范围给了10 ^100非常大,直接模拟肯定不行

那么就用 b 减去 a 来找,也算是一种模拟的方法

举个例子, a = 1299, b = 33

<1>33     330  3300   33000

(12)99   (1)299  1299    1299

------   -------- --------     -------

34      31  2001   32001

如果当前 b 比a的部分小,在前面添1

每次比较完在b后面添0

取所有比较结果中最小的数字作为答案

当然,如果a <= b 是可以直接得到答案的 ans = b - a

但是这题用G++提交不知道为什么会WA

C++就能过

Source code:

//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>
#include <stack>
#include <string>
#include <map>
#include <queue>
#include <vector>
#include <algorithm>
#define LL long long
#define Max(a,b) (((a) > (b)) ? (a) : (b))
#define Min(a,b) (((a) < (b)) ? (a) : (b))
#define Abs(x) (((x) > 0) ? (x) : (-(x)))
#define MOD 1000000007 using namespace std;

string Plus(string s1,string s2)
{
if(s1.length()<s2.length())
{
string temp=s1;
s1=s2;
s2=temp;
}
int i,j;
for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
{
s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0)); //注意细节
if(s1[i]-'0'>=10)
{
s1[i]=char((s1[i]-'0')%10+'0');
if(i) s1[i-1]++;
else s1='1'+s1;
}
}
return s1;
}

string Minus(string a,string b){
string c="",ans="",t;
int flag = , k = ;
bool flag2 = false;
if(a.length() < b.length() || (a.length() == b.length()&& a.compare(b) < )){
t = a;
a = b;
b = t;
flag2 = true;
}
int i = a.length() - , j = b.length() - ;
while(i >= && j >= ){
if(a[i] + flag > b[j]){
c += a[i] + flag - b[j] + '';
flag = ;
}
else if(a[i] + flag == b[j]){
c += '';
flag = ;
}
else{
c += (a[i] - '') + flag + - (b[j] - '') + '';
flag = -;
}
--i;
--j;
++k;
}
while(i >= ){
if(a[i] + flag < ''){
c += a[i] + flag + + '';
flag = -;
}
else{
c += a[i] + flag;
flag = ;
}
--i;
++k;
}
int len = k - ;
while(c[len] == '' && len > ) --len;
for(j = ; j <= len; ++j)
ans += c[j];
if(flag2){
ans += '-';
}
char tt;
for(i = , j = ans.length()-; i < j; ++i, --j){
tt = ans[i];
ans[i] = ans[j];
ans[j] = tt;
}
return ans;
} bool judge(string a, string b){
if(a.size() < b.size()) return false;
else if(a.size() > b.size()) return true;
else{
for(int i = ; i < a.size(); ++i){
if(a[i] > b[i]) return true;
else if(a[i] < b[i]) return false;
}
}
} int main(){
int i, j, t, n, m, numCase = ;
string s1,s2, hh;
string cnt, ans;
bool flag1;
scanf("%d",&t);
while(t--){
cin >> s1 >> s2;
flag1 = false;
int len1 = s1.size();
int len2 = s2.size();
if(judge(s2, s1)){
cout << "Case #" << ++numCase << ": " << Minus(s2, s1) << endl;
continue;
}
for(i = ; i < len1 - len2; ++i){
string ww = s1.substr(i, len2);
if(ww.compare(s2) == ){
flag1 = true;
break;
}
}
if(flag1){
cout << "Case #" << ++numCase << ": " << '' << endl;
continue;
}
for(i = ; i < len1 - len2 + ; ++i){
if(i == len1 - len2 + ){
hh = s1.substr(len1 - len2 - i + , i + len2 - );
} else{
hh = s1.substr(len1 - len2 - i, i + len2);
}
if(judge(hh, s2)){
string gg = "";
gg += s2;
ans = Minus(gg ,hh);
}
else{
ans = Minus(s2 ,hh);
}
s2 += "";
if(i == ){
cnt = ans;
} else{
if(judge(cnt, ans)){
cnt = ans;
}
}
}
cout << "Case #" << ++numCase << ": " << cnt << endl;
} return ;
}

HDU 3925 Substring 【大数相减】的更多相关文章

  1. Java 大数相乘、大数相加、大数相减

    思路来源:: https://blog.csdn.net/lichong_87/article/details/6860329 /** * @date 2018/6/22 * @description ...

  2. [小米OJ] 3. 大数相减

    题目链接 思路: 利用两个string保存相减的数,其他模拟即可. 参考了别人的一个处理减的步骤,很简洁好看. string substract(string str1, string str2) { ...

  3. 大数相减 C语言

    #include <stdio.h> #include <string.h> using namespace std; ],b[]; void Sub() { ; if(a = ...

  4. HDU 4652 Dice:期望dp(成环)【错位相减】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4652 题意: 给你一个有m个面的骰子. 两种询问: (1)"0 m n": “最后 ...

  5. C语言复习---获取最大公约数(辗转相除法和更相减损法)

    源自:百度百科 辗转相除法 辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法. 例如,求(,): ∵ ÷=(余319) ∴(,)=(,): ∵ ÷=(余58) ∴(,)=( ...

  6. 上机题目(中级)- 两个超级大的整数相加相减 (Java)

    代码例如以下: public class AddSub { public static void main(String[] args) { String a="46328648326846 ...

  7. C语言,最大公约数---更相减损术

    // 最大公约数 更相减损法 int commonDivisor() { int i,k,n=0; printf("请输入两个不同的正整数,用,隔开\n"); scanf(&quo ...

  8. C#-和时间有关的计算代码、时间相减 得到天数、小时、分钟、秒差

    asp.net(C#)时间相减 得到天数.小时.分钟.秒差   asp.net(C#)时间相减 得到天数.小时.分钟.秒差   DateTime dtone = Convert.ToDateTime( ...

  9. asp.net(C#)时间相减 得到天数、小时、分钟、秒差

    asp.net(C#)时间相减 得到天数.小时.分钟.秒差 DateTime dtone = Convert.ToDateTime("2007-1-1 05:00:00"); Da ...

随机推荐

  1. JQuery 限制文本框只能输入数字和小数点

    $(function(){ /*JQuery 限制文本框只能输入数字*/ $(".NumText").keyup(function(){ $(this).val($(this).v ...

  2. The process "E:\Qt\4.8.5\bin\qmake.exe" exited with code 2.(不能包含中文路径,qmake够弱智的)

    打开某个项目的时候,编译出现类似的错误 21:46:44: The process "E:\Qt\4.8.5\bin\qmake.exe" exited with code 2. ...

  3. Qt中QFtp获取带有中文的文件名称出现乱码的解决方法(执行操作前就转换编码)

    今天研究了一下QFtp这个类,发现访问得到的文件名称中一旦出现中文,不管怎么转换编码格式,最终显示出来的始终都是乱码.由于编码错误,我写了两个函数用于互相转换编码. 一个是由正常编码转为QFTP上所谓 ...

  4. Nginx 的 Echo 模块 —— echo-nginx-module(转)

    Nginx 有个 echo 模块可以用来输出一些简单的信息,例如: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2 ...

  5. 将文件从数据库(MySQL)中进行读取

    package com.play; import java.io.FileOutputStream; import java.io.OutputStream; import java.sql.Blob ...

  6. NSDate conversion utilities

    // Gets UTC NSDate from DateTime(.Net/WCF). + (NSDate *)fromDateTime:(NSString *)dateTime { NSDate * ...

  7. Andriod之Activity

    eclipse还原默认的面板设计:Window > Reset Perspective> OK1\ 1.多个Activity之间的关系: 2.Intent的基本作用: 3.在一个Activ ...

  8. js动态创建表格方法

    window.onload = function(){ var table = document.createElement('table'); table.border = 1; table.wid ...

  9. SharePoint Secure Store Service(SSSS)的使用(一)

    SSS在案例中的应用: SSS介绍 SSS部署 SSS应用 http://www.cnblogs.com/renzh/archive/2013/03/31/2990280.html 创建.部署.应用S ...

  10. aop切入点表达式

    1.切入点表达式:对指定的方法进行拦截,并且生成代理表达式. 2.拦截所有public方法 <aop:pointcut expression="execution(public * * ...