前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、高精加
#include <iostream>
using namespace std;
int ab[5005];//存储这个大数的每一位,0-len 从个位到高位
string a,b;//定义两个字符串来存储一个大数
int main()
{
cin>>a>>b;//输入这两个大数
int lena=a.size();//算出大数a的位数
int lenb=b.size();//算出大数b的位数
int len= max(lena,lenb);//两个数的最大数
if(lena>=lenb) {
//用较大的大数加较小的大数
for (int i = 0; i < lena; ++i) {
//将第一个数的每一位转换为int型数字,再存入数组
ab[i] = a[lena - 1 - i] - 48;
}
for (int i = 0; i < lenb; ++i) {
//将第二个数的每一位转换为int型数字,与第一位的数字相加,再存入数组
ab[i]+= b[lenb - 1 - i] - 48;
}
}
else{
for (int i = 0; i < lenb; ++i) {
//将第一个数的每一位转换为int型数字,再存入数组
ab[i] = b[lenb - 1 - i] - 48;
}
for (int i = 0; i < lena; ++i) {
//将第二个数的每一位转换为int型数字,与第一位的数字相加,再存入数组
ab[i]+= a[lena - 1 - i] - 48;
}
}
for (int i = 0; i <len ; ++i) {
//遍历数组,如果数大于9,位数就要进一位
if(ab[i]>=10){
ab[i]-=10;
ab[i+1]++;
}
}
while(a[len]>0){
//判断最大位的上一位是否大于0,如果大于,位数就加
len++;
}
for(int i=len-1;i>=0;i--){
//最后从最高位开始输出
cout<<ab[i];
}
return 0;
}
二、高精减
代码如下(示例):
#include <iostream>
using namespace std;
int ab[5005];//存储这个大数的每一位,0-len 从个位到高位
string a,b;//定义两个字符串来存储一个大数
int main()
{
cin>>a>>b;//输入这两个大数
int lena=a.size();//算出大数a的位数
int lenb=b.size();//算出大数b的位数
int len= max(lena,lenb);//两个数的最大数
if(lena>=lenb) {
//用较大的大数减较小的大数
for (int i = 0; i < lena; ++i) {
//将第一个数的每一位转换为int型数字,再存入数组
ab[i] = a[lena - 1 - i] - 48;
}
for (int i = 0; i < lenb; ++i) {
//将第二个数的每一位转换为int型数字与第一位数字相减,再存入数组
ab[i]-= b[lenb - 1 - i] - 48;
}
}
else{
for (int i = 0; i < lenb; ++i) {
//将第一个数的每一位转换为int型数字,再存入数组
ab[i] = b[lenb - 1 - i] - 48;
}
for (int i = 0; i < lena; ++i) {
//将第二个数的每一位转换为int型数字与第一位数字相减,再存入数组
ab[i]-= a[lena - 1 - i] - 48;
}
}
for (int i = 0; i <len-1 ; ++i) {
//遍历数组,如果数小于0,位数就要减一
if(ab[i]<0){
ab[i]+=10;
ab[i+1]--;
}
}
while(a[len-1]==0){
//判断最高位的下一位是否为0,是的话,位数就减一
len--;
}
for(int i=len-1;i>=0;i--){
//最后从最高位开始输出
cout<<ab[i];
}
return 0;
}
三、高精乘
代码如下(示例):
#include <iostream>
#include <cstring>
using namespace std;
int a1[5005],b1[5005],c[5005];//存储这个大数的每一位,0-len 从个位到高位
char a[5005],b[5005];//定义两个字符串来存储一个大数
int main()
{
cin>>a>>b;//输入这两个大数
int lena=strlen(a);//算出大数a的位数
int lenb=strlen(b);//算出大数b的位数
int len= lena+lenb;//两个数的最大数
for (int i = 1; i <=lena; ++i) {
//将第一个数的每一位转换为int型数字,再存入数组
a1[i] = a[lena - i] - 48;
}
for (int i = 1; i <= lenb; ++i) {
//将第二个数的每一位转换为int型数字与第一位数字相减,再存入数组
b1[i]= b[lenb - i] - 48;
}
for (int i = 1; i <=lena ; ++i) {
for (int j = 1; j <= lenb; ++j) {
c[i+j-1]+=a1[i]*b1[j];//相乘后的两个数加入c[] i位的数乘以j为的数,的位数在i+j-1位
}
}
for(int i=1;i<len;i++){
//遍历已经后已相乘后的数组
if(c[i]>9){
//模拟乘法进位
c[i+1]+=c[i]/10;
c[i]%=10;
}
}
while(c[len]==0&&len>1) len--;//判断最高位的下一位是否为0,是的话,位数就减一
for(int i=len;i>=1;i--){
//最后从最高位开始输出
cout<<c[i];
}
return 0;
}
四、高精除
#include <bits/stdc++.h>
using namespace std;
long long a[10001],b,lena,f,yushu,shang;
int main()
{
char c=getchar();
while (c>='0' && c<='9')
{
lena++;
a[lena]=(c-'0');
c=getchar();
}//类似快读,输入高精度数
cin>>b; //输入低精度数
for(int i=1;i<=lena;i++){
//模拟手算除法
yushu=a[i]%b;//记录余数
shang=a[i]/b;//记录商
a[i]=shang;//将商放入a数组
a[i+1]+=yushu*10;//若余数不为0,将它乘以10,加到下一位
}//以上为高精除以低精
for (int i=1;i<=lena;i++)//输出最后算出的商
{
if (f==0 && a[i]>0) f=1; //如果最高位不为0,就输出(防止前导0的输出)
if (f==1) putchar(a[i]+'0');//将数字型转为字符型输出
}
return 0;
}
五、阶乘之和利用高精加和高精乘
1.
#include "iostream"
using namespace std;
int a[101],s[101];
void cf(int x){
int jz=0;//进制
for (int i = 100; i >=0 ; --i) {
a[i]=a[i]*x+jz;//每次乘了之后再加进制
jz=a[i]/10;//进制为超过10的数
a[i]%=10;//取余后为这个位置的数
}
}
void jf(){
int jz=0;//进制
for (int i = 0; i <=100 ; ++i) {
s[i]+=a[i]+jz;//模拟加法进制
jz=s[i]/10;
s[i]%=10;
}
}
void sc(){
int w;
for (int i = 0; i <=100 ; ++i) {
if(s[i]!=0){
//找到第一个不为0的数
w=i;
break;
}
}
for(int i=w;i<=100;i++){
//从第一个不为0的数开始输出
cout<<s[i];
}
}
int main()
{
int n;
a[100]=s[100]=1;//初始化要为1,因为先要乘一
cin>>n;//求n的阶乘之和
for (int i = 2; i <=n ; ++i) {
cf(i);//先乘
jf();//再加
}
sc();//输出
return 0;
}
2.
#include <iostream>
using namespace std;
int a[10000];
int main()
{
int t,n,num;
cin>>t;
while(t--)
{
int i,j;
for(i=1;i<=1010;i++)
a[i]=0;
a[1]=1;
long long cnt=0;
int p=1;
cin>>n>>num;
for(i=2;i<=n;i++)
{
int jw=0;
for(j=1;j<=p;j++)
{
a[j]=a[j]*i+jw;
jw=a[j]/10;
a[j]%=10;
}
while(jw>0)
{
a[j]=jw%10;
jw/=10;
j++;
}
p=j-1;
}
for(int k=1;k<=p;k++)
{
if(a[k]==num) cnt++;
}
cout<<cnt<<endl;
}
return 0;
}