题目意思是,给你提供两个数字 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. grunt切换下载源

    nrm 是一个 NPM 源管理器,允许你快速地在NPM 源间切换: 安装:npm install -g nrm 列出可选源:nrm ls 切换:nrm use taobao 测试所有源连接时间:nrm ...

  2. 高性能Mysql主从架构的复制原理及配置详解(转)

    温习<高性能MySQL>的复制篇. 1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台 ...

  3. golang ODBC 访问access数据库(问题解决之心理路程)

    最近项目需要,需要操作access,以前是用VC++ OLE访问,网络用ACE库,感觉很庞大...决定用go试试 网上用的最多的就是这个https://github.com/weigj/go-odbc ...

  4. elasticsearch集群部署

    启动elk: zjtest7-redis:/usr/local/elasticsearch-2.3.4/bin# ./elasticsearch -d 后台运行 访问: http://192.168. ...

  5. cocos2d-x中的尺寸之二

    接下来我们再做些坏事,比如给EGLView设置分辨率,代码如下: pEGLView->setDesignResolutionSize(240, 320, kResolutionExactFit) ...

  6. QT在ui文件上建立信号操机制会不会对后期维护产生影响 - love4Mario的专栏 - 博客频道 - CSDN.NETQT在ui文件上建立信号操机制会不会对后期维护产生影响 - love4Mario的专栏 - 博客频道 - CSDN.NET

    QT在ui文件上建立信号操机制会不会对后期维护产生影响 - love4Mario的专栏 - 博客频道 - CSDN.NET QT在ui文件上建立信号操机制会不会对后期维护产生影响 分类: 学习心得 2 ...

  7. 自制的七个C,总结的太好了

    拿破仑·希尔把它叫做:“自制的七个C”: 1.控制自己的时间(Clock). 时间虽不断流逝,但也可以任人支配.你可以选择时间来工作.游戏.休息.烦恼..虽然客观的环境不一定能任人掌握,但人却可以自己 ...

  8. 【翻译】探究Ext JS 5和Sencha Touch的布局系统

    原文:Exploring the Layout System in Ext JS 5 and Sencha Touch 布局系统是Sencha框架中最强大和最有特色的一个部分. 布局要处理应用程序中每 ...

  9. srm 534

    250 Description 给你一个1*n的棋盘.两人轮流行动,每一个人能够把"o"向右移动到空格子.或者跨越连续两个"o"到空格子. 一个"o& ...

  10. iOS自定义控件教程:制作一个可重用的旋钮

    当你的APP需要一些新功能时,自定义UI控件会十分有用,尤其是这些自定义控件可以在其他APP里面很好的重用.Colin Eberhart写过一篇很棒的介绍自定义UI控件的教程.这个教程涉及的是一个继承 ...