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开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好) ...
随机推荐
- UVA - 820 Internet Bandwidth(最大流模板题)
题目: 思路: 直接套最大流的模板就OK了,注意一下输出的格式. 代码: #include <bits/stdc++.h> #define inf 0x3f3f3f3f #define M ...
- Journals in Fluid Mechanics
journal of fluid mechanics physics of fluids annual review of fluid mechanics
- Hdu 4864(Task 贪心)(Java实现)
Hdu 4864(Task 贪心) 原题链接 题意:给定n台机器和m个任务,任务和机器都有工作时间值和工作等级值,一个机器只能执行一个任务,且执行任务的条件位机器的两个值都大于等于任务的值,每完成一个 ...
- [bzoj4591][Shoi2015][超能粒子炮·改] (lucas定理+组合计数)
Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威 ...
- 邓_ HTML+CSS·经常使用的设计方法
:WPA;P:hejia,888?;S:Hejia666; https://github.com/qq1415551519 HTML+CSS·经常使用的设计方法: ================== ...
- pyhthon第一个小脚本——文件备份
先说说这个脚本的作用:对指定路径的文件进行压缩备份到另一个指定的路径,并且压缩文件的文件名用当时的日期+时间命名. 先是对着<简明Python教程>上的代码敲的,一堆错误,书上给的是lin ...
- hdu4288 Coder(线段树单点更新)
题意:支持增删,查操作,最后的序列式递增的. 做法:主要是如何维护mod5的sum值,这里左儿子可以不用管,关键是右儿子的处理,可以假设右儿子有t个节点,左儿子有cnt个节点, 则令(t+cnt)MO ...
- JAVA学习课本内容总结
二.基本类型 数组 枚举 1.基本类型 逻辑类型 boolean (true/false) 整数类型 byte(8位) short(16) int(32) long(64) 浮点类型 float ...
- Happy 2006 欧几里得定理
Happy 2006 Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 11956 Accepted: 4224 Descr ...
- zoj——1202 Divide and Count
Divide and Count Time Limit: 2 Seconds Memory Limit: 65536 KB Jack has several beautiful diamon ...