题目意思是,给你提供两个数字 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. c语言各类问题 代码

    定义一个结构体,有两个成员变量,一个整型的n,一个字符型的c,利用结构体类型声明一个具有5个元素的数组,并随机初始化,根据成员变量n进行从小到大排序,然后输出 冒泡排序然后 在输出结构体#includ ...

  2. Eclipse+ADT的环境搭建

    Index: . Java环境变量的设置 . Android环境变量的设置 1.Java环境变量的设置 A.属性名称:JAVA_HOME 属性值:C:\Program Files\Java\jdk1. ...

  3. Qt官方开发环境生成的exe发布方式--使用windeployqt(windeployqt是单独的程序,放在低版本qt4目录下也可以运行的)

    Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行.因此 Qt 官方开发环境里自带了一个 ...

  4. docpad建站记录

    记一下用docpad建站的过程作为备忘.不定时更新 why docpad wordpress对我来说太过于臃肿,我就想要个代码干净的小站来写东西.想要个markdown为基础的静态站. 比较流行的St ...

  5. JAVA GUI学习 - JFileChooser文件选择器组件学习:未包括JFileChooser系统类学习

    public class JFileChooserKnow { /** * @param args */ public static void main(String[] args) { // TOD ...

  6. js推断指定函数、变量是否存在的方法

    //推断是否存在指定函数 function isExitsFunction(funcName) { try { if (typeof (eval(funcName)) == "functio ...

  7. View中的onTouchEvent()与setOnTouchListener()中的ontouch()方法的事件处理先后顺序

    Touch事件的两种情况 1.覆写View.class中定义的onTouchEvent-->基于事件回调监听方式 @Override public boolean onTouchEvent(Mo ...

  8. innerhtml和innertext的用法以及区别

    例如: <div id="test"> <span style="color:red">test1</span> test2 ...

  9. CSS: inline-block的应用和float块高度塌陷

    普通流高度塌陷: 当块float浮动时,不会对块布局产生影响,块仍然会按照左右或者上下的顺序排列.但是会影响文档的排列,当文档的高度超过块的高度时,块的高度会产生塌陷现象.   高度塌陷解决方法:   ...

  10. BZOJ 1123: [POI2008]BLO( tarjan )

    tarjan找割点..不是割点答案就是(N-1)*2, 是割点的话就在tarjan的时候顺便统计一下 ------------------------------------------------- ...