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开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好) ...
随机推荐
- Python学习第二阶段,Day2,import导入模块方法和内部原理
怎样导入模块和导入包?? 1.模块定义:代码越来越多的时候,所有代码放在一个py文件无法维护.而将代码拆分成多个py文件,同一个名字的变量互不影响,模块本质上是一个.py文件或者".py&q ...
- [bzoj3209][花神的数论题] (数位dp+费马小定理)
Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了. ...
- Python基础—面向对象(进阶篇)
通过上一篇博客我们已经对面向对象有所了解,下面我们先回顾一下上篇文章介绍的内容: 上篇博客地址:http://www.cnblogs.com/phennry/p/5606718.html 面向对象是一 ...
- 百练4152:最佳加法表达式(dp+高精度)
描述 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放1个加号,最好的摆法就是12+34,和为36 输入有不超 ...
- HDU 4906 (dp胡乱搞)
The Romantic Her Problem Description There is an old country and the king fell in love with a devil. ...
- 常州模拟赛d8t2 绘画
分析:考虑记录每个坐标上每个颜色出现了几次,并由此算出每个颜色在这个坐标上的贡献.答案肯定是原图的答案扣去矩形的答案,再加上那个矩形同种颜色的贡献,这里的答案指的是Σdis.我们先要记录每个颜色在各个 ...
- 自定义EL表达式,将对象转成json格式,关键代码
做javaweb开发的最常用的一个东西el表达式,这个东西是个很好用的东西,但有些时候我们处理复杂的字符串操作,就有些相形见绌了,这个时候就需要用自定义的方法去实现更多简洁方便的事情. 下面自定义一个 ...
- 【驱动开发】file_operations ---linux 2.6.30
路径: linux-2.6.30/include/linux/fs.h struct file_operations { struct module *owner; loff_t ...
- zoj——3557 How Many Sets II
How Many Sets II Time Limit: 2 Seconds Memory Limit: 65536 KB Given a set S = {1, 2, ..., n}, n ...
- Ubuntu下非常规方法安装绿色软件(压缩包)
继上一篇http://www.cnblogs.com/EasonJim/p/7117567.html文章中说的常规方式安装的软件,都会自动在命令行及Dash Home中体现. 但是如果是使用压缩包进行 ...