高精度
当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就是商.
当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就是商.