高精度乘法

高精度乘法

匿名 (未验证) 提交于 2019-12-03 00:22:01
高精度乘法 输入:两行,每行表示一个非负整数(不超过10000位) 输出:两数的乘积。 样例1 样例输入1 99 101 样例输出1 9999 Java版: import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main (String[] args){ Scanner sc = new Scanner(System. in ); BigInteger a = sc.nextBigInteger(); BigInteger b = sc.nextBigInteger(); System. out .println(a.multiply(b)); } } C++版: #include<bits/stdc++.h> using namespace std ; int main(){ char st1[ 10005 ],st2[ 10005 ]; int a[ 10005 ],b[ 10005 ],c[ 20005 ]; int i,j,len1,len2; cin >> st1 >> st2; memset (a, 0 , sizeof (a)); memset (b, 0 , sizeof (b)); memset (c, 0 , sizeof (c)

高精度例题

匿名 (未验证) 提交于 2019-12-03 00:16:01
#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; } } } int main(){

C语言笔记:高精度计算问题

匿名 (未验证) 提交于 2019-12-03 00:15:02
文章目录 C语言中大数据类型的简述 高精度加法 高精度乘法 C语言中大数据类型的简述 我们知道,计算机内部直接使用int或者double等数据类型存储数据是有范围限制的,当运算数据较大时,计算机将会出现溢出情况,使得计算结果不够精确。例如,一个20位的十进制整数,如果用int类型变量存放,就会出现数据溢出。 当运算数超出了整型、实型能表示的范围,肯定不能直接用一个数的形式来表示。在运算过程中,能表示大数的数据类型有两种:整型数组和字符串 整型数组:每个元素存储1位,有多少位就需要多少个数组元素;每一位都是数的形式,可直接加减,运算时非常方便,但整型数组不能直接输入全部元素,只能一个一个输入,并且输入时,每两位数之间必须有分隔符,不符合人们输入数值的习惯, 输入输出时不方便。 字符串(本质上是一个字符数组):字符串的最大长度是多少,就可以表示多少位数字。用字符串表示数值能将全部位直接输入输出,但字符串中的每一个位是一个字符,必须将它转换为数值再进行运算, 运算时不方便 综合整型数组和字符数组的优缺点来看,我们在接下来的问题中,用字符串读入数据,运算时转存到整型数组中进行运算,接着再转换为字符串进行输出。 事实上,高精度运算就是通过编程的方法,把简单数学的运算步骤在计算机上完美地演示一遍而已。 高精度加法 问题描述: 求两个不超过200位的 非负整数 的和。输入两行

高精度计算(四):大整数乘法(采用“万进制”)

匿名 (未验证) 提交于 2019-12-02 23:49:02
【例1】大整数乘法。 #include <iostream> using namespace std; const int base=10000; const int maxlen=50+2; void charTobignum(char *ch,int *bignum) { } void printbignum(int *bignum) { } void multiply( int *bignum1, int *bignum2, int *bignum_ans) { } int main() { } ,可以Accepted。

基础算法模板――高精度运算

匿名 (未验证) 提交于 2019-12-02 23:38:02
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40028201/article/details/91338356 基础算法模板――高精度运算 1. 高精度加法 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 ++ ) { t + = A [ i ] ; if ( i < B . size ( ) ) t + = B [ i ] ; C . push_back ( t % 10 ) ; t / = 10 ; } if ( t ) C . push_back ( t ) ; return C ; } 2. 高精度减法 # include <iostream> # include <vector> using namespace std ; bool cmp ( vector < int > & A , vector < int > & B ) { if ( A . size ( ) != B .

1307:【例1.3】高精度乘法

匿名 (未验证) 提交于 2019-12-02 22:56:40
1307:【例1.3】高精度乘法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 4358 通过数: 1440 【题目描述】 输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。 【输入】 输入两个高精度正整数M和N。 【输出】 求这两个高精度数的积。 【输入样例】 36 3 【输出样例】 108 【来源】 No #include<bits/stdc++.h> using namespace std ; char a[ 200 ],b[ 200 ]; int x[ 200 ],y[ 200 ],s[ 401 ]; int main() { cin >>a>>b; int al= strlen (a),bl= strlen (b),flag= 0 ; for ( int i= 0 ;i<al;i++) { x[i]=a[al- 1 -i]- '0' ; } for ( int i= 0 ;i<bl;i++) { y[i]=b[bl- 1 -i]- '0' ; } for ( int i= 0 ;i<al;i++) { for ( int j= 0 ;j<bl;j++) { s[i+j]=s[i+j]+x[i]*y[j]; s[i+j+ 1 ]+=s[i+j]/ 10 ; s[i+j]=s[i+j]% 10 ; } } al= 400 ;

AcWing 794. 高精度除法

五迷三道 提交于 2019-12-02 18:19:06
https://www.acwing.com/problem/content/796/ #include<bits/stdc++.h> using namespace std; // A/b 商是c 余数是r vector<int> div(vector<int> &A, int b,int &r) //r是引用 { vector<int>C; //商 r=0;//余数 for(int i=A.size()-1;i>=0;i--) //除法是从最高位开始 { r=r*10+A[i]; //把各位留出,再加上这一位的各位 C.push_back(r/b); //商 是这一位整除b r%=b; //余数 } reverse(C.begin(),C.end()); //因为最开始push的是c的最高位,和我们前面定义的大整数存法是反过来的 //前面定义的大整数乘法是c【0】在最低位,是反过来的。所以要reverse一遍 while(C.size()>1&&C.back()==0) C.pop_back(); //商可能存在前导0 return C; } int main() { string a; //a很长,数位多 b很小,数位少 int b; cin>>a>>b; vector<int>A; for(int i=a.size()-1;i>=0;i--) A.push_back(a[i

C语言笔记:高精度计算问题

天大地大妈咪最大 提交于 2019-12-02 05:56:05
文章目录 C语言中大数据类型的简述 高精度加法 高精度乘法 C语言中大数据类型的简述 我们知道,计算机内部直接使用int或者double等数据类型存储数据是有范围限制的,当运算数据较大时,计算机将会出现溢出情况,使得计算结果不够精确。例如,一个20位的十进制整数,如果用int类型变量存放,就会出现数据溢出。 当运算数超出了整型、实型能表示的范围,肯定不能直接用一个数的形式来表示。在运算过程中,能表示大数的数据类型有两种:整型数组和字符串 整型数组:每个元素存储1位,有多少位就需要多少个数组元素;每一位都是数的形式,可直接加减,运算时非常方便,但整型数组不能直接输入全部元素,只能一个一个输入,并且输入时,每两位数之间必须有分隔符,不符合人们输入数值的习惯, 输入输出时不方便。 字符串(本质上是一个字符数组):字符串的最大长度是多少,就可以表示多少位数字。用字符串表示数值能将全部位直接输入输出,但字符串中的每一个位是一个字符,必须将它转换为数值再进行运算, 运算时不方便 综合整型数组和字符数组的优缺点来看,我们在接下来的问题中,用字符串读入数据,运算时转存到整型数组中进行运算,接着再转换为字符串进行输出。 事实上,高精度运算就是通过编程的方法,把简单数学的运算步骤在计算机上完美地演示一遍而已。 高精度加法 问题描述: 求两个不超过200位的 非负整数 的和。输入两行

大整数乘法(高精度乘法)

流过昼夜 提交于 2019-11-27 15:49:50
题目链接: https://www.luogu.org/problem/P1303 题目描述 求两数的积。 输入格式 两行,两个数。 输出格式 积 输入输出样例 输入 #1 复制 1 2 输出 #1 复制 2 说明/提示 每个数字不超过10^2000,需用高精 c++代码: #include<iostream> #include<cstring> using namespace std; int main() { string a; string b; cin>>a; cin>>b; if(a=="0"||b=="0") cout<<"0"; int A[10000]={0},B[10000]={0},C[10000]={0};//A用来存a中的每一个数 。。。。C用来存a和b的每一位数相乘的结果 int alen=a.length(); int blen=b.length(); int i,j; for(i=0;i<=alen;i++) A[alen-i]=a[i]-'0';//将a的每一位数转化为整数并逆序存入到A中 for(j=0;j<=blen;j++) B[blen-j]=b[j]-'0';//b的每一位数转化为整数并逆序存入到B中 for(i=1;i<=blen;i++)//外层为乘数;与b的每一位相乘; { int x=0; //记录进位数 for(j=1;j<

谈谈高精度压位的坑

筅森魡賤 提交于 2019-11-27 07:04:53
  有时我们发现要计算的数据非常大,只能用高精度来计算。而高精度的复杂度很大,与位数/开的数组大小成正相关关系,故为了降低复杂度,常常用“压位”的思想,比如一位(一个数组元素)不让它代表一个10进制的数,而是代表一个10000进制的数。这样原来一个100位的数就被压成了25位的数,时间和空间复杂度都有显著提升。   但对于一个陌生的知识,还是要谨慎使用,以防未预见的坑。   一般我们把10进制的高精度数转换为B进制的高精度数,为了方便,B一般为较大的10的k次方。对B的选择,既要考虑优秀的压缩位数,又要考虑在进位前的运算时避免溢出数组类型。B进制的数的数位上的数应为0到(B-1),因此数位上的数大于等于B时就应进位(别忘了等于B的情况)。   数组元素最好从1开始,否则要单独分很多要考虑的特殊情况。   由于压位后一位代表的数比10大很多,所以要注意数组的大小要能包括计算过程中可能出现的最大位数(不一定是结果的最大位数,在加法或乘法中可能出现计算过程中的最大位数比结果的最大位数还大的情况,注意别数组越界)。   最坑的一点莫过于输出了。压位后要注意中间0的丢失!因此对非最高位的每位数,不能忽略前导零! 来源: https://www.cnblogs.com/InductiveSorting-QYF/p/11349746.html