int范围:[-231,231-1],大约是1e9数量级。long long范围[-263,263-1],大约是1e18数量级。超过这个量级,我们就可以选择高精度计算了
高精度求阶乘题目代码
#include<iostream>
#include<cstdio>
using namespace std;
int n,a[101]={0},s[101]={0};
void change(int x)
{
int g=0;
for(int i=100;i>=0;i--)
{
a[i]=a[i]*x+g;
g=a[i]/10;
a[i]=a[i]%10;
}
}
void qh()
{
int g=0;//g表示进位
for(int i=100;i>=0;i--)
{
s[i]=s[i]+a[i]+g;
g=s[i]/10;
s[i]=s[i]%10;
}
}
void sc()
{
int w;
for(int i=0;i<=100;i++)
{
if(s[i]!=0)
{
w=i;
break;
}
}
for(int i=w;i<=100;i++)
printf("%d",s[i]);
}
int main()
{
scanf("%d",&n);
s[100]=a[100]=1;
for(int i=2;i<=n;i++)
{
change(i);
qh();
}
sc();
return 0;
}
其中
高精度乘法
void change(int x)//高精求积
{
int g=0;
for(int i=100;i>=0;i--)
{
a[i]=a[i]*x+g;
g=a[i]/10;
a[i]=a[i]%10;
}
}
高精度加法
#include<bits/stdc++.h>
using namespace std;
int a[1010],b[1010],c[1010];
int qh(string s1,string s2)
{
int temp;
for(int i = 0;i < s1.size();i++) a[i] = s1[s1.size()-1-i] - '0';//数组倒置
for(int i = 0;i < s2.size();i++) b[i] = s2[s2.size()-1-i] - '0';//数组倒置
int max = s1.size()>s2.size()?s1.size():s2.size();//取较大值做max,联想竖式加法
for(int i = 0;i < max;i++)
{
c[i] = a[i] + b[i] + temp;//temp作为进位值
temp = c[i] / 10;//先取进位
c[i] = c[i] % 10;//把c[I]的个位作为当前位的值
}
for(int i = 0;i < max;i++)
cout<<c[max - 1 - i];//倒序输出即可
}
int main()
{
string s,d;
cin>>s;
cin>>d;
qh(s,d);
return 0;
}
模拟竖式加法
算法描述:
- 定义字符数组s1,s2,分别用来存储两个加数,定义一个temp来存储进位,且初始化为0,定义一个整数数组c存储和。
- 字符数组转换成整数数组a和b。
- 个位相加即A[0]+B[0]+temp(初始化为0不会影响)=C[0],如果有进位(和是两位数),则把进位(和的十位)存储在temp中,个位存储在C[0]。
- 十位相加即A[0]+B[0]+temp=C[0],如果有进位(和是两位数),则把进位(和的十位)存储在temp中,个位存储在C[0]。
- 一直加下去,得出结果。
知识点
>>=运算符,为右移运算符。x >>= 3;即表示把十进制数x的二进制编码右移n位后的值赋给x
&=与运算
|=或运算
^= 异或运算。例如
x = 0x02;
x ^= 0x01;
x结果为3
?某些情况下可简化if
例如:
if (a>b) max=a;
else max=b;
可写成:
max=a>b?a:b;