我的思路:
0.定义变量,常量,数组
char a1[2005],b1[2005];
int c[4005],a[2005],b[5005],num,la,lb,i,j,k,set1=0,set2=0;
1.字符串数组存储两输入数
cin>>a1>>b1;
2.调用函数strlen()分别测定两字符串长度
la=strlen(a1);//计算长度
lb=strlen(b1);
3.判断两数是否为负数,并记录结果
a.若为负数则将字符串内的负数符号‘-’去掉,并将该字符串的长度减去1
if(a1[0]=='-')
{
la--;
set1=1;
for(i=0;i<=la-1;i++)
a1[i]=a1[i+1];
}
if(b1[0]=='-')
{
lb--;
set2=1;
for(i=0;i<=lb-1;i++)
b1[i]=b1[i+1];
}
4.将字符串赋值逆序(方便确定位数)给数组
for(i=0,j=la-1,k=lb-1;j>=0||k>=0;i++,j--,k--)
{
if(j>=0)
a[i]=a1[j]-'0';
if(k>=0)
b[i]=b1[k]-'0';
}
for(j=0;j<lb;j++)
5.进行乘法计算,并将值赋给整型数组
for(j=0;j<lb;j++)
for(i=0;i<la;i++)
{
c[i+j]+=a[i]*b[j];
}
6.进行进位计算
for(i=0;i<la+lb;i++)
{
if(c[i]>9)
{
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
}
7.判断计算结果的长度(不包括符号)
int n=la+lb-1;
while(c[n]==0&&n>0)
n-- ;
8.判断结果是否为负数
if((set1==0&&set2==0)||(set1==1&&set2==1))//结果为正
9.输出结果
if((set1==0&&set2==0)||(set1==1&&set2==1))//结果为正
for(i=n;i>=0;i--)
cout<<c[i];
else
{
cout<<'-';
for(i=n;i>=0;i--)
cout<<c[i];
}
完整代码如下:
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
char a1[2005],b1[2005];
int c[4005],a[2005],b[5005],num,la,lb,i,j,k,set1=0,set2=0;
int main()
{
cin>>a1>>b1;//读入两个数
la=strlen(a1);//计算长度
lb=strlen(b1);
//判断输入的两数是否为负数,并用set记录结果
if(a1[0]=='-')
{
la--;
set1=1;
for(i=0;i<=la-1;i++)
a1[i]=a1[i+1];
}
if(b1[0]=='-')
{
lb--;
set2=1;
for(i=0;i<=lb-1;i++)
b1[i]=b1[i+1];
}
//将字符串转换为数字,逆序存入数组
for(i=0,j=la-1,k=lb-1;j>=0||k>=0;i++,j--,k--)
{
if(j>=0)
a[i]=a1[j]-'0';
if(k>=0)
b[i]=b1[k]-'0';
}
//将两乘积存入数组c的对应位
for(j=0;j<lb;j++)
for(i=0;i<la;i++)
{
c[i+j]+=a[i]*b[j];
}
//进位操作
for(i=0;i<la+lb;i++)
{
if(c[i]>9)
{
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
}
//判断输入数的位数
int n=la+lb-1;
while(c[n]==0&&n>0)
n-- ;
//输出结果
if((set1==0&&set2==0)||(set1==1&&set2==1))//结果为正
for(i=n;i>=0;i--)
cout<<c[i];
else
{
cout<<'-';
for(i=n;i>=0;i--)
cout<<c[i];
}
return 0;
}