大数跨境
0
0

高精度乘

高精度乘 Social Companion
2018-09-15
0
导读:高精度乘单精度求 a=a*b。( 0<a<10250, 0<b<108)输入: 第一行:a

高精度乘单精度

求 a=a*b。( 0<a<10250,  0<b<108)

输入:

     第一行:a

     第二行:b

输出:

  a*b 的值。

样例输入:

   330

   100

样例输出:

   33000 
 
分析:

     1)a 的每一位都单独与 b 相乘;

     2)再由低到高位依次处理 a 的进位;

     3)最后处理最高位。

程序实现:

//高精度乘单精度 

#include<bits/stdc++.h>


using namespace std;

char s1[300],s2[300];

int a[300]; 

int main()

{

int la,b,m;

cin>>s1>>b;

la=strlen(s1);

for(int i=1;i<=la;i++)   //每位转换为数字与单精度乘 

    {

    a[i]=s1[la-i]-'0';

a[i]*=b;

}

for(int i=1;i<=la;i++)    //处理进位 

{

a[i+1]+=a[i]/10;

a[i]%=10;

}


m=a[la+1];          //处理最高位 

while(m>0)

{

a[++la]=m%10;

m/=10;

}


for(int i=la;i>=1;i--)   //倒序输出因为处理的过程是低位在前 

   cout<<a[i];

 return 0;

}

  

例 2.6.4 高精度乘高精度


求 c=a*b(0<a<10250,  0<b<10250)

输入:

     第一行:a

     第二行:b

输出:a-b 的值。

样例输入:

22222

33333

样例输出:

740725926

分析:

分析c数组下标的变化规律,可以写出如下关系式:ci = c’i +c”i +…由此可见,c i跟a[i]*b[j]乘积有关,跟上次的进位有关,还跟原c i的值有关,分析下标规律,有c[i+j-1]= a[i]*b[j]+ x + c[i+j-1]; x=c[i+j-1]/10 ; c[i+j-1]%=10;

假设乘数和被乘数的长度分别为 la 和 lb,则最后的乘积长度最长为 la+lb,最短为 la+lb-1;

程序实现:边乘边处理进位

#include<bits/stdc++.h>


using namespace std;


void getNum(int num[])   //输入并逆序存放 

{

char temp[500];

scanf("%s",temp);

memset(num,0,sizeof(int)*500);

num[0]= strlen(temp);

for(int i=1;i<=num[0];i++)

  num[i]=temp[num[0]-i]-48;

  return;

}


void printNum(int x[])    //输出 

{

for(int i=x[0];i>=1;i--)

  cout<<x[i];

  return;

}


void chengfa(int a[],int b[],int c[])   //计算乘法 

{

int i,j;

for(i=1;i<=b[0];i++)

{

for(j=1;j<=a[0];j++)

{

c[i+j-1]=a[j]*b[i]+c[i+j-1];    

c[i+j]+=c[i+j-1]/10;           //进位 

c[i+j-1]%=10;                   //余数保留 

}

}

int len=a[0]+b[0];

while(c[len]==0&&len>1) len--;

c[0]=len;

return;

}


int main()

{

int num1[500],num2[500], result[500]={0};

getNum(num1);

getNum(num2);

chengfa(num1,num2,result);

printNum(result);

 return 0;

}


【声明】内容源于网络
0
0
Social Companion
信息科技教学,个人思考随感的在线记事本
内容 791
粉丝 0
Social Companion 信息科技教学,个人思考随感的在线记事本
总阅读117
粉丝0
内容791