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 ...
随机推荐
- codeforces 609F. Frogs and mosquitoes 二分+线段树
题目链接 F. Frogs and mosquitoes time limit per test 2 seconds memory limit per test 512 megabytes input ...
- Python每日一练(1):计算文件夹内各个文章中出现次数最多的单词
#coding:utf-8 import os,re path = 'test' files = os.listdir(path) def count_word(words): dic = {} ma ...
- python自学笔记(二)python基本数据类型之字符串处理
一.数据类型的组成分3部分:身份.类型.值 身份:id方法来看它的唯一标识符,内存地址靠这个查看 类型:type方法查看 值:数据项 二.常用基本数据类型 int 整型 boolean 布尔型 str ...
- Web Api帮助页面或用户手册
我这么玩Web Api(一):帮助页面或用户手册(Microsoft and Swashbuckle Help Page) 前言 你需要为客户编写Api调用手册?你需要测试你的Api接口?你需要和 ...
- 我的Fedora环境
Fedora现在也更新到了第20个版本,只是在15+以后的版本,大多数操作,都是大同小异的,也不必特意去关注版本号,只有对应到具体的软件,可能会因为库的版本,有或多或少的区别. 之前每次都喜欢按照一些 ...
- QT实现,通过URL下载文件的接口实现
今天来把坑填上. 具体就是提供一个URL,并通过这个URL下载文件. MyDownloader.h: #ifndef MYDOWNLOADER_H #define MYDOWNLOADER_H cla ...
- QTableView表格滚动条样式(QSS真是细致到家了)
环境:Qt5.3 IDE:QtCreator 效果预览: 垂直与水平滚动条样式 代码: ui->QTableView->verticalScrollBar()->setStyleSh ...
- 网页中获取网络mp3文件的时常
<html> <audio id="audio" controls> <source src="http://cdn.kaishuhezi. ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- python3 ImageTk 安装方法
使用命令: $ sudo yum search PIL | grep python3 可显示得知: python3-dogpile-cache.noarch : A caching front-end ...