问题标题: 高精度

0
0

0
0
0
0
0
尹宗鑫
尹宗鑫
新手守护
新手守护

高精度乘法:#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;
}

0
0
我要回答