高精度

                        高精度
当a+b的a和b的大小比long long还大,就要用到高精度了
加法:
1,读入    先输入到字符串s,s1中,在转换成整数  
               注:是倒着的,如:s=12; 转换的a=21;b也一样;
                 for(i=0;i<s.length();i++)
                   a[s.length()-i]=int(s[i]-'0');
                 for(i=0;i<s1.length();i++)
                   b[s.length()-i]=int(s1[i]-'0');
2,过程  相当于列竖式
            结果用c数组表示
             c[i+1]=c[i]/10;//进位 
             c[i]=c[i]%10;//只留各位,就是列竖式
              c[i]=c[i](进位的别忘)+a[i]+b[i];
3,输出      结果的各个都在c中,倒着输出
                 while(c[c1])==0&& c1>1) c1--;
                  for( int i=c1;i>=1;i-- )   cout<<c[i];
                  return 0;
        
4,程序


#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,i,j,c1=1001;
string s,s1;
int a[1012]={},b[1012]={},c[1012]={};
cin>>s>>s1;
for(i=0;i<s.length();i++)
 a[s.length()-i]=int(s[i]-'0');
for(i=0;i<s1.length();i++)
 b[s1.length()-i]=int(s1[i]-'0'); 
for(i=1;i<=1001;i++)
{
c[i]=c[i]+a[i]+b[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;

while(c[c1]==0 && c1>1) c1--;
for(i=c1;i>=1;i--) cout<<c[i];
return 0;  
}


可能有问题


 


加(高精度)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m=0,i,j;
string s,s1;
int a[1010]={},b[1010]={},c[1010]={};
cin>>s>>s1;
for (i=0;i<=s.length();i++)
a[s.length()-i]=int(s[i]-'0');
for (i=0;i<=s1.length();i++)
b[s1.length()-i]=int(s1[i]-'0');
for (i=1;i<=1000;i++)
{
c[i]=c[i]+a[i]+b[i];
c[i+1]=c[i+1]+c[i]/10;
c[i]=c[i]%10;
}
for (i=1000;i>=1;i--)
if (c[i]!=0) 
{
m=i;
break;
}
if (m==0) 
{
cout<<'0';
return 0;
}
for (i=m;i>=1;i--)
cout<<c[i];
return 0;
}














减法:a-b




1,输入  和加法输入一样
简便:
reverse(s.begin(),s,end()); 将字符串s翻转
for(i=o;i<n;i++) a[i+1]=s[i]-'0';


(何卓锟)说: 还是打这个:
cin>>s1>>s2;    
    for(i=0;i<=s1.size()-1;i++)a[i+1]=int(s1[s1.size()-i-1]-'0');
    for(i=0;i<=s2.size()-1;i++)b[i+1]=int(s2[s2.size()-i-1]-'0');    


2,过程
必须大数减小数


判断位数,如果一样就从高位往低位比较,如果啊a<b,要输出负号再交换


memset(s,0,sizeof()) //清0
然后列竖式
for(i=1;i<=len;i++)
{
  c[i]=c[i]+a[i]-b[i];
  if(c[i]<0)
{c[i]+=10;
c[i+1]--;
}
}




3,输出 还是倒着输出
k=s1.size();
while(k>1&&c[k]==0) k--; 或for(;k>1&&c[k]==0;k--);


for(i=k;i>=1;i--)cout<<c[i];






乘法:
输入输出都一样(倒着)


主要是列竖式(过程)
例题
     2 3
* 6 6 6 
---------


高精乘思路:
用2*666再用3*666






    2 3
* 6 6 6 
---------
       18
     12
     18
   12
   18
 12
---------
15318
高精度*单精度
#include <bits/stdc++.h>
using namespace std;
long long a[1000],b,c[2000000];
int main(){
string s1;
cin>>s1;
scanf("%d",&b);
int lena=s1.size();
for (int i=0;i<lena;i++)
a[i+1]=s1[lena-i-1]-'0';//将读入的字符串倒序处理成int数组
for (int i=1;i<=lena;i++) {
c[i]+=a[i]*b;//计算 
c[i+1]=c[i]/10;//将个位以上的数移到ci+1,之后再去处理剩下的进位 
c[i]=c[i]%10;//保留个位 

int i;
for (i=lena+1;c[i]>9;i++)//从lena+1开始处理,如果这里存在十位及以上的数,就处理 
{
c[i+1]=c[i]/10;
c[i]%=10;
}//处理前面累积的一大堆数 
for (int j=i;j>=1;j--)
printf("%d",c[j]);
return 0;
}




高精度*高精度
伪代码:
{ cin>>s1;
cin>>s2;
int lena=s1.size(),lenb=s2.size();
for (int i=0;i<lena;i++)
a[i+1]=s1[lena-i-1]-'0';//将读入的字符串倒序处理成int数组,下同 
for (int i=0;i<lenb;i++)
b[i+1]=s2[lenb-i-1]-'0';
for (int i=1;i<=lena;i++) {
int x=0;
for (int j=1;j<=lenb;j++) {
   c[i+j-1]=c[i+j-1]+a[i]*b[j]+x;//计算 
   x=c[i+j-1]/10;//处理进位 
   c[i+j-1]=c[i+j-1]%10;
 }
c[i+lenb]=x;//最后的进位 
} int lenc=lena+lenb;
while (c[lenc]==0 && lenc>1)
lenc--;//清空末尾的0 
for (int i=lenc;i>=1;i--)
printf("%d",c[i]);
return 0;
}


除法:


高精度乘单精度:
模拟列竖式 
a÷b
用a的长度除b从大到小位数的对应长度
如;67÷900  先用67除以90,余数23*10,再把个位0落下来,就是230,再除以67;


最终要的部分:
for(int i=1;i<=n;i++)
{
x=x*10+a[i];
a[i]=x/b;
x%=b;
}




高精*高精:
思路:首先你那个a数组存储被除数,b数组存储除数.
然后有一个指标i来表示做到第几位辣.
还有一个指针h指向前面的要做减法的最高位.
再用一个数组c表示商.


然后,你需要不停的比大小,比的是指针h到i的这段数与b的大小.
若b这段大,则在c[i]记录商的第i位,并且让h指向a最前面的非零位;
否则继续让a这段减b.


最后留下来的a就是商.





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值