c语言大整数运算,C语言大数乘法
1.乘法定律:一个数的第I位乘以另一个数的第j位会累加到结果的第j位,结果的数组会为每个数组元素保存2位。最后,携带结果并打印出来。
注意:乘法运算后的位数k不会超过m n。
乘法步骤如下:
数组A存储一个数,数组B存储一个数,这个数乘以位放入数组c。
c语言代码:(时间复杂度小于O (n),分治法,错位加法)# includesdio.h
#包含数学. h
#包含字符串. h
#定义M 10000
char s1[M],s2[M],s[M];
int a[M],b[M],c[M];
int main(){
int i,j,m,n,k;
scanf(%s%s ,s1,S2);
memset(c,0,sizeof(c));
n=strlen(S1);
m=strlen(S2);
k=nm;//保证相乘后的位数不会大于k。
printf( S1=% d S2=% d \ n 的长度,n,m);
/*用数字将字符串s1和s2按相反顺序排列*/
for(I=0;I n;我)
a[I]=S1[n-I-1]- 0 ;
for(I=0;我是m;我)
b[I]=S2[m-1-I]- 0 ;
/*乘法*/
for(I=0;I n;我)
for(j=0;j m;j)
c[I j]=a[I]* b[j];
for(I=0;I=k;i ){
if(c[i]=10){
c[I 1]=c[I 1]c[I]/10;
c[i]=c[i];
}
}
/*删除前导0*/
I=k;
while(c[I]==0)I-;
/*判断两个非负数的乘积是否为0,打印c[]*/
如果(i 0){
printf(“0”);
}
否则{
for(;I=0;我-)
printf(%d ,c[I]);
}
printf( \ n );
返回0;
}代码操作和计算结果如下:
Java语言:导入Java . util . scanner;
公共类BigDecimal {
//输入两个超大整数作为字符串,计算两个值相乘的结果。
公共静态void main(String[] args) {
Scanner in=新扫描仪(system . in);
string a=in . next();
string b=in . next();
字符串结果=multiply(a,b);
System.out.println(结果);
}
//计算两个整数的乘积
私有静态字符串乘法(字符串a,字符串b) {
//用于存储结果
StringBuilder ans=new StringBuilder();
//反转两个大整数,使它们可以从位相乘。
StringBuilder a1=新的StringBuilder(a);
StringBuilder B1=new StringBuilder(b);
a1 . reverse();
B1 . reverse();
//用于存储中间计算的结果
int[]arr=new int[a1 . length()B1 . length()];
//开始乘法,从两个大整数的位开始,也就是求逆后的第一位。
for(int I=0;I a1 . length();i ){
//B的每一位是A的第I位的乘积,每个周期乘以B的每一位一次,A移动一位。
for(int j=0;j B1 . length();j ){
//这就构成了一个错位加法,它保存了结果中每一位的累积和。这里,数字的字符减去字符“0”等于数字本身。
arr[I j]=(a1 . charat(I)- 0 )*(B1 . charat(j)- 0 );
}
}
//给每个位一个大于10的进位,保留余数
for(int I=0;I arr . length-1;i ){
arr[I 1]=arr[I]/10;
arr[I]%=10;
}
//将结果放入答案集中。
for(int I=0;I arr . length-1;i ){
ans . append(arr[I]);
}
return ans.reverse()。toString();
}
}代码思路和C语言基本一致。
计算结果如下:
Python语言:因为python有一个无限精度的int类型,所以用python实现大整数乘法是没有意义的,但是思路是一样的。
我是刚刚的同学,刚入网的小白。()
(疯狂的暗示喜欢!注意了!前进!喜欢!注意了!前进!)
你的支持是你同学前进的最大动力!
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。