高精度A+B、A-B、A*B、A/B


前言

提示:以下是本篇文章正文内容,下面案例可供参考

一、高精加

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_45879198/article/details/117881107
A-B
今日推荐