新手天翼
新手守护
高精度乘法:#include<iostream>
using namespace std;
//高精度乘法 2*2==4位
//3*3==6位 La+Lb
string s1,s2;
int a[256],b[256],c[513];
int La,Lb,Lc;// 串长
void read()
{ int i;
cin>>s1>>s2;
La=s1.length();
Lb=s2.length();
//第1步:s1倒序放在a[]数组
//个位开始乘
for(i=1;i<=La;i++)
a[i]=s1[La-i]-'0';
for(i=1;i<=Lb;i++)
b[i]=s2[Lb-i]-'0';
}
void cf()
{
int i,j,w,x,k;
for(i=1;i<=La;i++)//两道循环
for(j=1;j<=Lb;j++)//从个位开始
//依次去乘每一位
{x=a[i]*b[j];//先算乘积
w=i+j-1;//!!!一定要记住
c[w]=c[w]+x%10;//本位是累和+x的个位
c[w+1]=c[w+1]+x/10+c[w]/10;
//!w+1位累和有乘法进位+w位的加法进位
c[w]=c[w]%10;//本位只要个位
}
//打印
for(i=La+Lb;i>=2;i--) //留下个位
if(c[i]==0)
continue;
else break;
for(k=i;k>=1;k--)
cout<<c[k];
cout<<endl;
}
int main()
{ read();cf();
return 0;
}
高精度减法:
#include<iostream>
using namespace std;
//高精度加法
string s1,s2;//用两个字符串读入数据,用整形出错
int a[256],b[256];//整形数组 a是把s1中的字符一个个存放在a[]数组中
//a[1]放的s1的个位,a[2]放十位...
//b[1]放的s2的个位,b[2]入十位...
//a[100]放s1的。。。 a[i]=a[i]+b[i];
void read()
{
cin>>s1>>s2;
}
void sub()
{ int i,j,La,Lb,flag=0,k;
La=s1.length();
Lb=s2.length();//取两个串的长度
//先把s1倒序放在a[]数组中 ,a[1]放个位
for(i=1;i<=La;i++)
a[i]=s1[La-i]-'0';//-48把s1放在a里面
for(i=1;i<=La;i++)
cout<<a[i]<<" ";
cout<<endl;
//把s2倒序放在b[]数组中
for(i=1;i<=Lb;i++)
b[i]=s2[Lb-i]-'0';
for(i=1;i<=Lb;i++)
cout<<b[i]<<" ";
cout<<endl;
//第2步:避免麻烦,让La最大
if(La<Lb)
{ swap(La,Lb);//!!容易出错
swap(a,b);//交换两个数组
flag=1;//做标记
}
else //情况2:23-32,两个串一样长,减起来也要交换
if(La==Lb)//有可能要交换5555-5556
{ //从最高位开始向下一个个比较
for(i=La;i>=1;i--)
if(a[i]==b[i]) continue;
else if(a[i]<b[i])//小数-大数要交换
{ flag=1; swap(a,b);
} else break; //大数-小数,直接结束for
}
//一定是La最大
//第3步:从个位开始到最高位:对应相加
for(i=1;i<=La;i++)
{
a[i]=a[i]-b[i];//对应位相-
if(a[i]<0)
{ a[i+1]--;// 向i+1借1
a[i]=a[i]+10;// 本位加10
}
}
//第4步:打印://03432
if(flag==1)//小数-大数 输出-
cout<<"-";
//从最高位开始找第一个不是0的数开始打印
for(i=La;i>=1;i--)//如果全部是0,个位的0要打,所以i到2位
if(a[i]==0)
continue;
else break; //找到第一个不是0下标i
for(k=i;k>=1;k--)
cout<<a[k];
cout<<endl;
}
int main()
{ read();
sub();
return 0;
}
高精度加法:
#include<iostream>
using namespace std;
//高精度加法
string s1,s2;//用两个字符串读入数据,用整形出错
int a[256],b[256];//整形数组 a是把s1中的字符一个个存放在a[]数组中
//a[1]放的s1的个位,a[2]放十位...
//b[1]放的s2的个位,b[2]入十位...
//a[100]放s1的。。。 a[i]=a[i]+b[i];
void read()
{
cout<<"输入两个数字串进行加法"<<endl;
cin>>s1>>s2;
}
void add()
{ int i,j,La,Lb;
La=s1.length();
Lb=s2.length();//取两个串的长度
//先把s1倒序放在a[]数组中 ,a[1]放个位
for(i=1;i<=La;i++)
a[i]=s1[La-i]-'0';//-48把s1放在a里面
cout<<"打印倒序:个位 --十位...";
for(i=1;i<=La;i++)
cout<<a[i]<<" ";
cout<<endl;
//把s2倒序放在b[]数组中
for(i=1;i<=Lb;i++)
b[i]=s2[Lb-i]-'0';
cout<<"打印倒序:个位 - 十位";
for(i=1;i<=Lb;i++)
cout<<b[i]<<" ";
cout<<endl;
//第2步:避免麻烦,让La最大
if(La<Lb)
{ swap(La,Lb);//!!容易出错
swap(a,b);//交换两个数组
}
//一定是La最大
//第3步:从个位开始到最高位:对应相加
for(i=1;i<=La;i++)
{
a[i]=a[i]+b[i];//对应位相加
if(a[i]>=10)
{ a[i+1]++;// 向i+1进1
a[i]=a[i]-10;//
}
}
//第4步:打印:加法可能最高位有进位:La+1
//03432
cout<<"加的结果为:";
if(a[La+1]>0)
cout<<a[La+1];
//从高位向个位打
for(i=La;i>=1;i--)
cout<<a[i];
cout<<endl;
}
int main()
{ read();add();
return 0;
}