HDU 3925 Substring 【大数相减】
题目意思是,给你提供两个数字 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 【大数相减】的更多相关文章
- Java 大数相乘、大数相加、大数相减
思路来源:: https://blog.csdn.net/lichong_87/article/details/6860329 /** * @date 2018/6/22 * @description ...
- [小米OJ] 3. 大数相减
题目链接 思路: 利用两个string保存相减的数,其他模拟即可. 参考了别人的一个处理减的步骤,很简洁好看. string substract(string str1, string str2) { ...
- 大数相减 C语言
#include <stdio.h> #include <string.h> using namespace std; ],b[]; void Sub() { ; if(a = ...
- HDU 4652 Dice:期望dp(成环)【错位相减】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4652 题意: 给你一个有m个面的骰子. 两种询问: (1)"0 m n": “最后 ...
- C语言复习---获取最大公约数(辗转相除法和更相减损法)
源自:百度百科 辗转相除法 辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法. 例如,求(,): ∵ ÷=(余319) ∴(,)=(,): ∵ ÷=(余58) ∴(,)=( ...
- 上机题目(中级)- 两个超级大的整数相加相减 (Java)
代码例如以下: public class AddSub { public static void main(String[] args) { String a="46328648326846 ...
- C语言,最大公约数---更相减损术
// 最大公约数 更相减损法 int commonDivisor() { int i,k,n=0; printf("请输入两个不同的正整数,用,隔开\n"); scanf(&quo ...
- C#-和时间有关的计算代码、时间相减 得到天数、小时、分钟、秒差
asp.net(C#)时间相减 得到天数.小时.分钟.秒差 asp.net(C#)时间相减 得到天数.小时.分钟.秒差 DateTime dtone = Convert.ToDateTime( ...
- asp.net(C#)时间相减 得到天数、小时、分钟、秒差
asp.net(C#)时间相减 得到天数.小时.分钟.秒差 DateTime dtone = Convert.ToDateTime("2007-1-1 05:00:00"); Da ...
随机推荐
- Python 安装、循环语句、数据类型(一)
一.关于版本的选择 Should i use Python 2 or Python 3 for my development activity?转载自Python官网 Short version: P ...
- C# Regex ignoring non-capturing group
E.g I want match the keword "3398" after "red" from the string "This is red ...
- [转]JSon数据解析的四种方式
转至http://blog.csdn.net/enuola/article/details/7903632 作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的js ...
- BootStrap学习2 typeahead
首先看看这些 http://www.wrapcode.com/bootstrap/typeahead-json-objects/ http://stackoverflow.com/questions/ ...
- 射频识别技术漫谈(14)——Mifare S50与S70的存取控制
存取控制指符合什么条件才能对卡片进行操作. S50和S70的块分为数据块和控制块,对数据块的操作有“读”.“写”.“加值”.“减值(含传输和存储)”四种,对控制块的操作只有“读”和“写”两种. S50 ...
- SpringMVC之访问静态文件
我们在进行springMVC开发时,必定会在jsp页面引入js文件.img文件和css文件.大多数人会将这些分类存放在WebRoot文件下新建的文件夹下面.同时,会在web.xml文件中配置拦截所有请 ...
- Oracle中sign函数和decode函数的使用
Oracle中sign函数和decode函数的使用 1.比较大小函数SIGN sign(x)或者Sign(x)叫做 符号函数,其功能是取某个数的符号(正或负): 当x>0,sign(x)=1; ...
- leetcode_question_67 Add Binary
Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...
- GDB命令行最基本操作
程序启动: A.冷启动 gdb program e.g., gdb ./cs gdb –p pid e.g., gdb –p `pidof c ...
- 解決 centos中-bash: vim: command not found
用centos 的主机的時候, 用 vim 时出现 -bash: vim: command not found. 只能使用 vi. 那么如何安裝 vim 呢? 输入 rpm -qa|grep vim ...