高精度乘法

C++高精度小数

浪尽此生 提交于 2020-03-10 13:13:12
当前我在咕啥 1.目前咕压位高精。 2.想都还没想的k次方根 1.1版本的功能 1.新增开方功能(目前只能开平方根,精度不理想) 2.新增快速幂(目前没遇到bug,过了模板) 3.有两种输出方式(fprint为小数形式,mprint输出方式见P1517) 4.快读 1.0版本的功能 1.加减乘除 2.double与该类型加减乘除(加减还没弄) 3.比较大小(小于等于大于) 4.自定义数组长度($width$),小数点位数($bas$),除法精度($eps$),double转该类型精度($deps$) 5.都测了一下,应该没有问题 ### 目前已知的缺陷、 1.~~不能与其他类型多次同时读入(应该能和string同时读入), 比如你前一半读入该类型后一半其他类型是可以的,但是你再读一次该类型就要炸~~ 接了个快读上去,解决了 2.代码丑 4.没有第三点 5.double转小数精度不高,貌似在1e-6左右 6.string转小数好像没测 7.后面应该可以优化前面的代码,但是还在加功能,所以没优化。 有神仙说有bug,目前乘法法肯定不会有bug(能过一整道题),所以问题可能出现在减法和加法上,除法大概率不会bug, 修复了 之前0.02会玄学变成0.2 修复了 *暂且命名为mdob* *转载标明出处* 如果遇到bug请提出 #include<iostream> #include

高精度,乘法加法

南楼画角 提交于 2020-03-05 22:54:51
#include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <cstdlib> #include <vector> #include <iostream> #define lson rt<<1 #define rson rt<<1|1 using namespace std; typedef long long ll; typedef pair<int, int> P; const int maxn=2e2+10; struct dashu { int s[maxn*5]; int flag,len; void ini() { memset(s, 0, sizeof s); flag=len=1; } void pri() { for(int i=0;i<len;i++) { printf("%c",s[len-i-1]+'0'); } } void jinwei() { for(int i=0;i<len;i++) { if(s[i]>9) { s[i+1]+=s[i]/10; s[i]=s[i]%10; len=max(i+2,len); } } } }; bool cmp(dashu d1,dashu d2) { if(d1.flag==1&&d2.flag==1) {

高精度(加减乘除

走远了吗. 提交于 2020-03-05 22:10:55
https://www.cnblogs.com/ECJTUACM-873284962/p/6509429.html 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<string> 6 #include<cmath> 7 #include<set> 8 #include<vector> 9 #include<stack> 10 #include<queue> 11 #include<map> 12 using namespace std; 13 #define ll long long 14 #define se second 15 #define fi first 16 const int INF= 0x3f3f3f3f; 17 const int N=4e6+5; 18 19 string s1,s2; 20 int a[2001],b[2001],c[4002],len1,len2; 准备工作 1 void cun() 2 { 3 cin>>s1>>s2; 4 len1=s1.length(); 5 len2=s2.length(); 6 for(int i=1;i<=len1;i++) 7 a[i]=s1[len1-i]-'0'; 8

高精度加减乘除(无压位)

六月ゝ 毕业季﹏ 提交于 2020-02-26 10:45:45
快排是小范围插入排序,大范围是快排 java是大整数类 python是无限大 大整数 浮点数的话就不讲了 高精度相加 vector自带size 加引用就不会引用一遍 c11-for循环范围遍历,迭代器或者vector 一个变量list,迭代器,vector 大黄鸭测试法,自动判断是什么类型是什么 压位 可能加减乘除同时运行 strlen,str.length().前者on,后者o1 没压位就是没有万进制什么的 ​``` #include <cstdio> #include <cstring> #include <iostream> #include <vector> using namespace std; vector<int> add(vector<int> &A, vector<int> &B) // 用引用是为了不用复制一遍 { //if (A.size() < B.size()) return add(B, A); vector<int> C; int t = 0; for(int i = 0; i < A.size() || i < B.size(); i++) { if(i < A.size()) t += A[i]; if(i < B.size()) t += B[i]; C.push_back(t % 10); t /= 10; } if(t) C.push

P1303 A*B Problem(高精度乘法)

喜欢而已 提交于 2020-02-19 20:20:21
P1303 A*B Problem 模拟就好了。 \(c_ {i+j} +=a_i \times b_j\) .时间复杂度 \(O(n*m)\) ( FFT版 可以做到 \(O((n+m)\log (n+m)\) ) #include<bits/stdc++.h> using namespace std; string times(string a,string b) { int aa[15000]={0},bb[15000]={0},ans[30000]={0}; string str=""; for(int i=0;i<a.length();i++) aa[a.length()-i-1]=a[i]-'0'; for(int i=0;i<b.length();i++) bb[b.length()-i-1]=b[i]-'0'; for(int i=0;i<a.length();i++) for(int j=0;j<b.length();j++) { ans[i+j]+=aa[i]*bb[j]; if(ans[i+j]>9)ans[i+j+1]+=ans[i+j]/10,ans[i+j]=ans[i+j]%10; } int len=a.length()+b.length(); while(ans[len-1]==0&&len-1>0)len--; for(int i=0;i<len

CSP-S/J 信息学1307:高精度乘法-信息学一本通(c++)

♀尐吖头ヾ 提交于 2020-02-08 13:03:45
CSP-SJ信息学资料下载 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 19379 通过数: 6592 【题目描述】 输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。 【输入】 输入两个高精度正整数M和N。 【输出】 求这两个高精度数的积。 【输入样例】 36 3 【输出样例】 108 【来源】 No 代码如下: # include <cstdio> # include <cstring> # include <iostream> # include <algorithm> using namespace std ; const int maxn = 209 ; char x [ maxn ] , y [ maxn ] ; int a [ maxn ] , b [ maxn ] , c [ 2 * maxn ] ; //注意积的位数和乘数位数之间的关系 int main ( ) { cin >> x >> y ; int len1 = strlen ( x ) , len2 = strlen ( y ) ; memset ( a , 0 , sizeof a ) ; memset ( b , 0 , sizeof b ) ; memset ( c , 0 , sizeof c ) ; for ( int i = len1 - 1 ,

Acwing #793(高精度乘法)

风格不统一 提交于 2020-02-04 04:51:36
# include <iostream> # include <vector> # include <string> using namespace std ; vector < int > mul ( vector < int > & A , int b ) { vector < int > C ; //结果数组 //t保存进位 for ( int i = 0 , t = 0 ; i < A . size ( ) || t ; i ++ ) { if ( i < A . size ( ) ) { t + = A [ i ] * b ; } C . push_back ( t % 10 ) ; //压入本位数组 t / = 10 ; //计算进位 } return C ; } int main ( ) { string a ; int b ; cin >> a >> b ; //将高精度的整数各位存入数组中,从个位开始 vector < int > A ; for ( int i = a . size ( ) - 1 ; i >= 0 ; i -- ) { A . push_back ( a [ i ] - '0' ) ; } vector < int > res = mul ( A , b ) ; for ( int i = res . size ( ) - 1 ; i >= 0

高精度乘法

梦想的初衷 提交于 2020-01-30 17:04:35
#include #include #include using namespace std; struct HighAcc { char str[100]; int length; int minflag; }; void reverse_str(HighAcc &num) { char* p = &num.str[0]; char* q = &num.str[num.length - 1]; char tmp = 0; while (p <= q) { tmp = *p; *p = *q; q = tmp; p++; q–; } } void Ture_num(HighAcc &num) { char p = &num.str[0]; while (*p) { *p = *p - ‘0’; p++; } } HighAcc mul(HighAcc num1, HighAcc num2) { Ture_num(num1); Ture_num(num2); reverse_str(num1); reverse_str(num2); HighAcc res = {0}; if ((num1.length == 1 && num1.str[0] == 0) || (num2.length == 1 && num2.str[0] == 0)) { res.length = 1;

AcWing 793.高精度乘法

梦想的初衷 提交于 2020-01-30 13:41:50
AcWing 793.高精度乘法 题目描述 给定两个正整数A和B,请你计算A * B的值。 输入格式 共两行,第一行包含整数A,第二行包含整数B。 输出格式 共一行,包含A * B的值。 数据范围 1≤A的长度≤100000, 1≤B≤10000 输入样例 2 3 输出样例 6 题目思路 低角标存低位,高角标存高位;依次进位,用A[i]乘整个b #include<iostream> #include<string> #include<vector> using namespace std; vector<int> mul(vector<int> &A,int &b) { vector<int> C; for(int i=0,t=0;i<A.size()||t;i++) { if(i<A.size()) t += A[i] * b; C.push_back(t%10); t /= 10; } return C; } int main() { string a; int b; cin >> a >> b; vector<int> A,C; for(int i=a.size()-1;i>=0;i--) A.push_back(a[i] - '0'); C = mul(A,b); for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);

高精度乘法与高精度加法

谁说胖子不能爱 提交于 2020-01-28 01:37:10
高精度乘法与高精度加法面对的是两个数数位很长,长到连long long也装不下的情况下,这时候的想法是先用字符数组把原来的两个数看成是字符串装进去,然后通过-‘0’操作,把每一位转换成整型,再对每一位进行计算,把结果单独再放进一个整型数组 一.高精度乘法 需要注意的是,这里要有两层循环,第一层是对乘数循环,第二层则是被乘数。 # include <bits/stdc++.h> using namespace std ; char a [ 100000 ] , b [ 100000 ] ; int c [ 100000 ] = { 0 } , i , f = 0 , k = 0 , p = 1 ; //f记录进位,k是数组下标,p用来错位// int main ( ) { cin >> a >> b ; int la = strlen ( a ) , lb = strlen ( b ) ; for ( i = la - 1 ; i >= 0 ; i -- ) //乘数循环 { for ( int j = lb - 1 ; j >= 0 ; j -- ) //被乘数循环 { c [ k ] = ( a [ i ] - '0' ) * ( b [ j ] - '0' ) + f + c [ k ] ; f = c [ k ] / 10 ; //进位 c [ k ] % = 10 ; k