int占32位即4个字节,int的范围是[-2^31,2^31-1]
long long占64位即8个字节,long long的范围是[-2^63,2^63-1]
在数据特别大是就需要使用高精度了
1.高精度加法
算法核心:
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;
举个例子:
题目描述
高精度加法,相当于 a+b problem,不用考虑负数。
输入格式
分两行输入。a,b≤10^500。
输出格式
输出只有一行,代表 a+b 的值。
输入输出样例
输入 #1复制
1 1
输出 #1复制
2
输入 #2复制
1001 9099
输出 #2复制
10100
说明/提示
20% 的测试数据,0≤a,b≤10^9;
40% 的测试数据,0≤a,b≤10^18。
#include<bits/stdc++.h>
using namespace std;
char s1[505],s2[505];
int a[505],b[505],c[505];
int main()
{
int la,lb,lc;
scanf("%s",s1);
scanf("%s",s2);
la=strlen(s1);
lb=strlen(s2);
for(int i=0;i<la;i++)
a[la-i]=s1[i]-'0';
for(int i=0;i<lb;i++)
b[lb-i]=s2[i]-'0';
lc=max(la,lb)+1;
for(int i=1;i<=lc;i++)
{
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;
}
if(c[lc]==0&&lc>0) lc--;
for(int i=lc;i>0;i--)
printf("%d",c[i]);
return 0;
}
2.高精度减法
要点:(1)如果a<b,则需要交换a与b
(2)如果a[i]<b[i],需要高位借一当十使用
if(a[i]<b[i])
{
a[i++]--;
a[i]=a[i]+10;
}
a[i]=a[i]-b[i];
举个例子:
题目描述
高精度减法。
输入格式
两个整数 a,b(第二个可能比第一个大)。
输出格式
结果(是负数要输出负号)。
输入输出样例
输入 #1
2 1
输出 #1
1
说明/提示
- 20% 数据 a,b 在 long long 范围内;
- 100% 数据 0<a,b≤10^10086。
#include<bits/stdc++.h> using namespace std; char s1[10090],s2[10090],s3[10090]; int a[10090],b[10090],c[10090]; int flag=0; bool compare(char s1[],char s2[]) { int m=strlen(s1),n=strlen(s2); if(m!=n) return m>n; for(int i=0;i<m;i++) { if(s1[i]!=s2[i]) return s1[i]>s2[i]; } return true; } int main() { int la,lb,lc; scanf("%s",s1); scanf("%s",s2); if(!compare(s1,s2)) { flag=1; strcpy(s3,s1); strcpy(s1,s2); strcpy(s2,s3); } la=strlen(s1); lb=strlen(s2); for(int i=0;i<la;i++) a[la-i]=s1[i]-'0'; for(int i=0;i<lb;i++) b[lb-i]=s2[i]-'0'; lc=max(la,lb); for(int i=1;i<=lc;i++) { if(a[i]<b[i]) { a[i+1]--; a[i]+=10; } c[i]=a[i]-b[i]; } while(c[lc]==0&&lc>1) lc--; if(flag==1) printf("-"); for(int i=lc;i>0;i--) printf("%d",c[i]); return 0; }
3.高精度乘法
-
a[[i]*b[j]对应c[i+j-1]的位置
-
核心
c[i+j-1]+=a[i]*b[i]; c[i+j]+=c[i+j-1]/10; c[i+j-1]%=10;
举例代码:
#include<bits/stdc++.h> using namespace std; char s1[1000005],s2[1000005]; int a[1000005],b[1000005],c[1000005]; int main() { int la,lb,lc; scanf("%s",s1); scanf("%s",s2); la=strlen(s1); lb=strlen(s2); for(int i=0;i<la;i++) a[la-i]=s1[i]-'0'; for(int i=0;i<lb;i++) b[lb-i]=s2[i]-'0'; lc=la+lb; for(int i=1;i<=la;i++) { for(int j=1;j<=lb;j++) { c[i+j-1]+=a[i]*b[j]; c[i+j]+=c[i+j-1]/10; c[i+j-1]%=10; } } if(c[lc]==0&&lc>0) lc--; for(int i=lc;i>0;i--) printf("%d",c[i]); return 0; }