高精度乘法

1307:【例1.3】高精度乘法

偶尔善良 提交于 2020-01-24 17:21:12
1307:【例1.3】高精度乘法 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。 【输入】 输入两个高精度正整数M和N。 【输出】 求这两个高精度数的积。 【输入样例】 36 3 【输出样例】 108 【来源】 #include <cstdio> #include <cstring> #include <iostream> using namespace std; int main() { char ach[101],bch[101]; int a[101],b[101],c[10001],lena,lenb,lenc,i,j,jw; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); scanf("%s",ach); scanf("%s",bch); lena=strlen(ach),lenb=strlen(bch); for(i=0;i<lena;i++) a[lena-i]=ach[i]-'0'; for(i=0;i<lenb;i++) b[lenb-i]=bch[i]-'0'; for(i=1;i<=lena;i++){ jw=0; for(j=1;j<=lenb;j++){ c[i+j-1

高精度乘法

十年热恋 提交于 2020-01-16 16:44:11
# include <iostream> # include <cmath> # include <queue> # include <cstring> # include <algorithm> using namespace std ; int main ( ) { ios :: sync_with_stdio ( false ) ; cin . tie ( 0 ) ; string A , B ; cin >> A >> B ; if ( A == "0" || B == "0" ) { cout << 0 << endl ; return 0 ; } int len_A = A . size ( ) , len_B = B . size ( ) ; int len_res = len_A + len_B ; int a [ len_A ] , b [ len_B ] , res [ len_res ] ; memset ( res , 0 , sizeof ( res ) ) ; for ( int i = len_A - 1 , j = 0 ; i >= 0 ; i -- , j ++ ) { a [ j ] = A [ i ] - '0' ; } for ( int i = len_B - 1 , j = 0 ; i >= 0 ; i -- , j ++ ) { b [

高精度计算

本小妞迷上赌 提交于 2020-01-13 18:18:42
(1)加法 算法的基本思路是模拟列竖式进行加减乘除运算。 输入的数据应当以字符串的方式读取,然后将每个字符转换成数字,并保存在一个整型数组中。 我们输入的自然数字,如“123456789”,最高位“1”是在左侧。而我们进行加、减、乘法运算的时候,是需要个位对齐的。因此,一个自然的思路是将个位放在[0],十位放在[1],以此类推。 两个整型数组a[]和b[],将对应位相加的结果保存在c[]中。如有进位则模10取个位,并设进位。 string A , B ; // 两个加数 cin >> A >> B ; // 读入两个加数 /* 处理输入的数据 */ int m1 = A . length ( ) ; // 加数A的实际位数 int m2 = B . length ( ) ; // 加数B的实际位数 int n = max ( m1 , m2 ) + 1 ; // 数组长度。因为可能有进位,所以要+1 int a [ n ] = { 0 } ; // 加数a,以整型数组表示 int b [ n ] = { 0 } ; // 加数b,以整型数组表示 保证了相同位数,不同的用0补齐 int c [ n ] = { 0 } ; // 和c,以整型数组表示 // 将字符型数组转换成“逆序”的整型数组,最低位在左侧,最高位在右侧 // 如:输入的2019,在数组中则是9102。这样个位从下标

洛谷P1303高精度乘法

≯℡__Kan透↙ 提交于 2020-01-12 23:41:28
#include<algorithm> #include<iostream> #include<string> #include<cstring> #include<vector> using namespace std; const int N=5e5+10; int A[N],B[N],C[N]; int mul(int sizeA,int sizeB) { for(int i=1;i<=sizeA;i++) for(int j=1;j<=sizeB;j++) { C[i+j-1]+=A[i]*B[j]; } int len=sizeA+sizeB; for(int i=1;i<len;i++) { if(C[i]>9) C[i+1]+=C[i]/10; C[i]%=10;//进位 } while(C[len]==0&&len>1) len--;//去高位0 return len; } int main() { string a,b; cin>>a>>b; for(int i=1;i<=a.size();i++) A[i]=a[a.size()-i]-'0'; for(int i=1;i<=b.size();i++) B[i]=b[b.size()-i]-'0'; int len=mul(a.size(),b.size()); for(int i=len;i>=1;i--)

高精度害死人

£可爱£侵袭症+ 提交于 2020-01-11 16:23:08
高精度加减乘除板子,整理一下成为函数。 思路 都是字符串读入,倒序存储。数组 \(a_0\) 表示 \(a\) 的位数。 加法 每一位相加,判断是否需要进位。循环结束后判断最高位是否需要进位,最终调整一下位数。 减法 每一位相减,不够减的向前一位借位 (感觉我在学习小学一年级知识??) 最后需要调整位数,去掉前导0. 乘法 这里和普通的竖式乘法不同。高精乘高精思路为,答案的第i+j-1位,等于两乘数分别的第 i 位和第 j 位相乘。最后需要处理进位和位数的问题。 除法 如上图,是地球人用纸和笔做的除法。但是很显然,计算机走试商的方法太麻烦,那就只能把除数移到被除数的最高位(空余的用0补上),再相减,直到剩下的数小于除数(同时记录商),然后进行下一位的计算。 代码 加法 #include<iostream> #include"cmath" #include<cstdio> #include<algorithm> using namespace std; string in; int a[999],b[999],ans[999]; int strlen(string x){ int tot = 0; while(x[tot++] != '\0'); return tot-1; } void _P(int x[],int y[]){ ans[0] = max(x[0],y[0]);

刘子闻讲的高精度【太强了】

半腔热情 提交于 2019-12-11 03:04:41
刘子闻(神!)讲的高精度【太强了】 1.6 10:大整数加法 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的和。 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。 输出 一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。 样例输入 22222222222222222222 33333333333333333333 样例输出 55555555555555555555 #include<cstdio> #include<cstring> using namespace std; int main() { char a[205]={0},b[205]={0}; int d[205]={0},f[205]={0},e[205]={0},c,l=0; int l1,l2; gets(a); gets(b); l1=strlen(a); l2=strlen(b); for(c=0;c<l1;c++) { d[205-l1+c]=a[c]-'0'; } for(c=0;c<l2;c++) { f[205-l2+c]=b[c]-'0'; } c=205; while(c--) { e[c]+=d[c]+f[c]; if(e[c]>=10) { e[c-1]++; e[c]=e[c]

高精度(加减乘)

空扰寡人 提交于 2019-12-10 20:19:24
高精度加法 把数转换为数组,模拟竖式相加过程,把每一位相加,如果这一位大于等于10,需要进位即下一位加1. 还需要注意的是,每次我们都要把数字颠倒,否则不满足竖式加法的规则。 最后输出的时候,判断是否有前导0 代码1:模拟竖式相加 1 for (int i = lenx;i >= 1;i--) 2 { 3 ans[i]=sa[i]+sb[i]; 4 } 5 for (int i = 1;i <=lenx;i++) 6 { 7 if (ans[i]>=10){ 8 ans[i+1]+=ans[i]/10; 9 ans[i]%=10; 10 } 11 } 代码2: 判断前导0 1 while (ans[lenx]==0&&lenx>1) lenx--; 2 for (int i = lenx;i>=1;i--) 3 { 4 printf ("%d",ans[i]); 5 } 完整代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; char s1[10000],s2[10000]; int sa[10000],sb[10000]; int len1,len2,lenn,lenm; int ans[1000]; int main() {

高精度乘方一

夙愿已清 提交于 2019-12-07 09:06:17
先说说整指数乘方,百度上搜到一个程序,效率很高,代码简洁: int pow(int x,int n) { int temp(x),res(1); while(n) { if(n&1) { res *= temp; } temp *= temp; n>>=1; } return res; } 把2^61代入运算,内存变化图是这样的:61的二进制形式是111101 res = 2 2 32 8192 536870912 2.305843009213693952E18 temp= 4 16 256 65536 4294967296 1.8446744073709551616E19 2.305843009213693952E18 是最终结果 除红色部分外有9次是关键乘法,前两个红色 2 2 近似不占运算时间,后面红色 1.8446744073709551616E19 是冗余运算。 我的源程序和上述算法效率差不多,因构思不一样,也贴出来,以x^61为例: Dim a(50) As Integer i = 0 Do yCzs3 = yCzs.Zx(1) Mod 2 ‘yCzs.Zx(1)中存放的是指数 If yCzs3 = 0 Then yCzs.Zx(1) = yCzs.Zx(1) / 2 a(i) = 1 Else yCzs.Zx(1) = yCzs.Zx(1) - 1 a(i) = 0

C++高精度加减乘除模板

梦想的初衷 提交于 2019-12-03 11:45:22
其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的。 其中高精度除法返回一对string,分别表示商和余数。 代码: #include <bits/stdc++.h> using namespace std; const int maxn = 100010; int a[maxn], b[maxn], res[maxn]; string add(string s1, string s2) { // under condition: s1,s2>=0 // 初始化部分 int n = s1.length(), m = s2.length(); for (int i = 0; i < n; i ++) a[i] = s1[n-1-i] - '0'; for (int i = 0; i < m; i ++) b[i] = s2[m-1-i] - '0'; int len = max(n, m) + 1; for (int i = n; i < len; i ++) a[i] = 0; for (int i = m; i < len; i ++) b[i] = 0; for (int i = 0; i < len; i ++) res[i] = 0; // 处理部分 for (int i = 0; i < len; i ++) { res[i] += a[i] + b

高精度例题

喜你入骨 提交于 2019-12-03 07:19:16
1168:大整数加法 #include <bits/stdc++.h> using namespace std; const int N = 1e3 + 10; int a[N],b[N],c[N],k,maxlen; void read(int arr[],int len){ char s[N]; scanf("%s",s); len = strlen(s); maxlen = max(maxlen,len); int go = 0; while(arr[go] == '0' && go < len) go++; for(int i = go;i < len ; ++i) arr[len - i - 1] = s[i] - '0'; } void print(int arr[]){ while(arr[maxlen] == 0 && maxlen > 1) --maxlen; for(int i = maxlen;i >= 0; --i) printf("%d",arr[i]); puts(""); } void add(int a[],int b[],int c[],int len){ for(int i = 0;i < len; ++i){ c[i] += a[i] + b[i]; if(c[i] >= 10){ c[i + 1] ++; c[i] -= 10; } } }