AcWing算法基础1.4
高精度
高精度加法,高精度减法,高精度乘低精度,高精度除以低精度,大概平时用的最多的就是这四个,模板有两种(因为我现在不太会用vector,就用数组也写了个,23333)
高精度运算和人工手算差不多,就是模拟人工手算的过程,乘法有点不一样,在下面有提到,大致也是模拟运算
废话不多说,上模板
高精度加法
// C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
if (A.size() < B.size()) return add(B, A); vector<int> C;
int t = ;
for (int i = ; i < A.size(); i ++ )
{
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % );
t /= ;
} if (t) C.push_back(t);
return C;
}
高精度减法
// C = A - B, 满足A >= B, A >= 0, B >= 0
vector<int> sub(vector<int> &A, vector<int> &B)
{
vector<int> C;
for (int i = , t = ; i < A.size(); i ++ )
{
t = A[i] - t;
if (i < B.size()) t -= B[i];
C.push_back((t + ) % );
if (t < ) t = ;
else t = ;
} while (C.size() > && C.back() == ) C.pop_back();
return C;
}
这里高精度减法对于A < B 的情况我们特判下输出个 - 就好了,模板第九行是比较巧的一步,因为我们减一位后 t 的取值范围是(-10,10)t 可能是正数也可能是负数,对于正数我们可以直接拿来用,对于负数要向前面一位进1,相当于把 t 加10,这里写成(t + 10)% 10 就能把两种情况写在一起了
高精度乘低精度
// C = A * b, A >= 0, b > 0
vector<int> mul(vector<int> &A, int b)
{
vector<int> C;
int t = ;
for (int i = ; i < A.size() || t; i ++ )
{
if (i < A.size()) t += A[i] * b;
C.push_back(t % );
t /= ;
} return C;
}
乘法和我们人模拟的算有点差别,比如156 * 23 算第一位的时候直接拿6 * 23,然后再拿5 * 23 + 进位,以此类推
高精度除以低精度
// A / b = C ... r, A >= 0, b > 0
vector<int> div(vector<int> &A, int b, int &r)
{
vector<int> C;
r = ;
for (int i = A.size() - ; i >= ; i -- )
{
r = r * + A[i];
C.push_back(r / b);
r %= b;
}
reverse(C.begin(), C.end());
while (C.size() > && C.back() == ) C.pop_back();
return C;
}
上面是用vector的模板,对于不会用vector的我,用数组写了个,呃呃呃呃....
高精度加法
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std;
int add(int a[], int b[]);
const int N = + ;
char x1[N], x2[N];
int a[N], b[N], c[N]; int main()
{
scanf("%s%s",x1,x2);
int len1 = strlen(x1), len2 = strlen(x2);
for(int i = len1 - , j = ; i >= ; i --, j ++)
a[j] = x1[i] - '';
for(int i = len2 - , j = ; i >= ; i --, j ++)
b[j] = x2[i] - ''; int id = add(a, b);
for(int i = id - ; i >= ; i --)
printf("%d",c[i]);
return ;
//add(a,b); } int add(int a[], int b[])
{
int mx = , id = ;
if(strlen(x1) >= strlen(x2)) mx = strlen(x1);
else mx = strlen(x2);
int t = ;
for(int i = ; i < mx; i ++)
{
c[id++] = (a[i] + b[i] + t) % ;
t = (a[i] + b[i] + t) / ;
}
if(t) c[id++] = t;
return id;
}
高精度减法
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std;
int mun(int a[], int b[]);
bool cmp(int a[], int b[]); //用来比较a,b谁大,判断是输出正数还是负数
const int N = + ;
char x[N], y[N];
int a[N], b[N], c[N]; int main()
{
scanf("%s%s",x,y);
int lena = strlen(x), lenb = strlen(y);
for(int i = lena - , j = ; i >= ; i --, j ++ ) a[j] = x[i] - '';
for(int i = lenb - , j = ; i >= ; i --, j ++ ) b[j] = y[i] - ''; if(cmp(a, b)) cout << "-";
int temp = mun(a, b);
for(int i = temp - ; i >= ; i -- )
printf("%d",c[i]);
return ;
} int mun(int a[], int b[])
{
if(cmp(a, b)) return (mun(b, a)); int t = , mx = max(strlen(x), strlen(y));
for(int i = ; i < mx; i ++ )
{
t = a[i] - b[i] + t;
c[i] = (t + ) % ;
if(t < ) t = -;
else t = ;
} int id = mx;
for(int i = mx - ; i > ; i --) //去除前导零
{
if(c[i] == ) id -- ;
else break;
}
return id; //id是数组c的长度
} bool cmp(int a[], int b[])
{
int mx = max(strlen(x), strlen(y));
for(int i = mx - ; i >= ; i -- )
{
if(a[i] > b[i]) return ;
if(a[i] < b[i]) return ;
}
return ;
}
高精度乘法
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std;
int mul(int a[], int b);
const int maxa = + ;
char x[maxa];
int a[maxa], c[maxa], b; int main()
{
scanf("%s%d",x,&b);
int lena = strlen(x);
for(int i = lena - , j = ; i >= ; i --, j ++ ) a[j] = x[i] - ''; int id = mul(a, b);
for(int i = id - ; i >= ; i -- )
cout << c[i];
return ;
} int mul(int a[], int b)
{
int t = , id = , lena = strlen(x);
for(int i = ; i < lena; i ++ )
{
t = a[i] * b + t;
c[id++] = t % ;
t = t / ;
}
if(t) c[id++] = t;
return id;
}
高精度除法
#include <iostream>
#include <cstring>
#include <cstdio> using namespace std;
int div(int b[], int k);
const int N = + ;
string a;
int b[N], c[N], k, t; //t是余数 int main()
{
cin >> a >> k;
for(int i = ; i < a.size(); i ++ ) b[i] = a[i] - ''; int id = div(b, k);
int q = ;
for(int i = ; i < id - ; i ++ )
if(c[i] == ) q ++ ;
else break;
for(int i = q; i < id; i ++ )
printf("%d",c[i]);
printf("\n%d",t);
return ;
} int div(int b[], int k)
{
int id = ;
for(int i = ; i < a.size(); i ++ )
{
t = t * + b[i];
c[id++] = t / k;
t %= k;
}
return id;
}
输出两行,第一行是商,第二行是余数
AcWing算法基础1.4的更多相关文章
- AcWing算法基础1.5
前缀和与差分 两个内容都比较少,就放一起写了 设数组 a 的前 n 项为a1 , a2 , a3 ... an 前缀和数组就是每一项是a数组的前i项和,比如前缀和数组res,res[ 1 ] = a[ ...
- AcWing算法基础1.3
二分 二分分为整数二分和实数二分,其中整数二分模板有两个 模板: 整数二分模板 第一种模板将区间分为[ l , mid ] 和 [ mid + 1, r ] int bsearch_1(int l, ...
- AcWing算法基础1.2
排序 归并排序 归并排序和快速排序相反,快排是先排后分再合并,归并则是先分后排再合并 归并排序时间复杂度是O(n logn) 分析: ------------------------------ ...
- AcWing算法基础1.1
排序 快速排序(快排) 写题的时候用的不多基本都是直接sort ( ),面试可能要手撸快排,上模板 void quick_sort(int q[], int l, int r) { if(l > ...
- 背包四讲 (AcWing算法基础课笔记整理)
背包四讲 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高 ...
- Levenberg-Marquardt算法基础知识
Levenberg-Marquardt算法基础知识 (2013-01-07 16:56:17) 转载▼ 什么是最优化?Levenberg-Marquardt算法是最优化算法中的一种.最优化是寻找使 ...
- 解读Raft(一 算法基础)
最近工作中讨论到了Raft协议相关的一些问题,正好之前读过多次Raft协议的那paper,所以趁着讨论做一次总结整理. 我会将Raft协议拆成四个部分去总结: 算法基础 选举和日志复制 安全性 节点变 ...
- 腾讯2017年暑期实习生编程题【算法基础-字符移位】(C++,Python)
算法基础-字符移位 时间限制:1秒 空间限制:32768K 题目: 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间. 你能帮帮小Q吗? ...
- 算法基础_递归_求杨辉三角第m行第n个数字
问题描述: 算法基础_递归_求杨辉三角第m行第n个数字(m,n都从0开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好) ...
随机推荐
- ubuntu_linux自动补全出现问题
问题:输入: cd p,使用Tab补全,期望进入pub_work目录,虽然自动补全,成功进入目录:却给我打印一连串的字符,纠结: fly@Flyme:~$ cd p+ local cur prev w ...
- Quadtrees(四分树)
uva 297 Quadtrees Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Subm ...
- MongoDB增加用户、删除用户、修改用户读写权限及只读权限(注:转载于http://www.2cto.com/database/201203/125025.html)
MongoDB 增加用户 删除用户 修改用户 读写权限 只读权限, MongoDB用户权限分配的操作是针对某个库来说的.--这句话很重要. 1. 进入ljc 数据库: use ...
- 邮票(codevs 2033)
题目描述 Description 已知一个 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K —— 表示信封上能够贴 K 张邮票.计算从 1 到 M 的最大连续可贴出的邮资. 例如,假设有 ...
- 质因数分解 2012年NOIP全国联赛普及组
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 已知正整数 n是两个不同的质数的乘积,试求出较大的那个质数 . 输入描述 Inp ...
- 【BZOJ3790】神奇项链(manacher,树状数组)
题意: 思路:生成一些回文拼起来使生成的段数最小 显然存在一种最优的方案,使生成的那些回文是目标串的极长回文子串 求出对于每个位置的最长回文子串,问题就转化成了: 给定一些已知起始和终止位置的线段,求 ...
- 洛谷—— P3811 【模板】乘法逆元
https://www.luogu.org/problem/show?pid=3811 题目背景 这是一道模板题 题目描述 给定n,p求1~n中所有整数在模p意义下的乘法逆元. 输入输出格式 输入格式 ...
- codevs—— 1077 多源最短路
1077 多源最短路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 已知n个点(n<=100),给你 ...
- 网上的仿QQ验证码,详细使用方法
struts2的配置 和代码 1.生成图片流 类名:VerifyCodeUtils /** * 生成图片流 * @author Administrator * */ import java.awt.C ...
- ojdbc.jar
Oracle的jdbc驱动是ojdbc.jar 文件,那么mysql的jdbc驱动是什么呢? 匿名 | 浏览 689 次 发布于2015-06-07 02:06 最佳答案 MySQL的JDBC ...