高精度乘单精度
求 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;
}

