高精度(代码篇)

想直接学习的来看这里就好了

高精度加##

        老手来看,新手学学(高精度第一篇)-CSDN博客

#include
#include
using namespace std;
 
vector add(vector &A,vector &B)
{
	    vector C;
		int t = 0;
		for(int i=0; i> n;
	while(n--)
	{
		int cnt = 0, flag = 0;
		string a = "",b = "";
		vector A,B,C;
		while(cin >> a)  
		{
			A.clear();
			if(a == "0") break;
			if(!cnt) 
			{
				b = a;
				cnt = 1;
				continue;
			}
			for(int i=a.size()-1; i>=0; i--) A.push_back(a[i] - '0');
			
			if(cnt == 1)
			{
				for(int i=b.size()-1; i>=0; i--) B.push_back(b[i] - '0');
				cnt++;
			}
			
	        C = add(A,B);
	        B = C;   
	        flag = 1;
		}
		
		if(flag)
		for(int i=C.size()-1; i>=0; i--) cout << C[i];
		else
		for(int i=0; i

高精度减

##

老手来看,新手学学(高精度减法)-CSDN博客

#include 
using namespace std;
 
const int MAXN = 1e4+4; //根据题目的最大值。+4为了防止A+B出现进位
char s1[MAXN] = {};//存储字符串
char s2[MAXN] = {};//存储字符串
char tmp[MAXN] = {};//交换用字符串
int a[MAXN] = {};//存储加数A
int b[MAXN] = {};//存储加数B
int c[MAXN] = {};//存储和B
 
int main() {
    scanf("%s %s", s1, s2);//读入字符串
    
    int lena = strlen(s1);
    int lenb = strlen(s2);
    //判断最终的结果符号
    if ((lena=0; i--) {
        //因为我们是从索引 0 开始,所以最高位是保存在 len-1
        if (0==c[i] && lena>1) {
            //注意要有 lena>1 这个条件。考虑特殊情况,加法结果为 00,我们实际要输出 0。
            lena--;
        } else {
            //第一个不是零的最高位,结束删除
            break;
        }
    }
 
    //逆序打印输出
    for (int i=lena-1; i>=0; i--) {
        printf("%d", c[i]);
    }
    printf("\n");
    
    return 0;
}

高精度乘##

老手来看,新手学学(高精度大数乘大数)-CSDN博客

#include 
using namespace std;
int main(){
	// 大整数 乘 大整数 是 大整数 乘 int 的进阶版 
	string a_s,b_s; //大整数 a 和 b 的字符串形式 
	int a[521]={0},b[521]={0},ans[521*2]={0}; //a, b, ans 的 int数组形式 
	
	int len_a,len_b,len,carry=0,i,j;
	//len_a 为 a 的长度, len_b为 b 的长度, len 为 ans 的长度, carry为进位 
	//切记carry要初始化为 0!!! 
	
	cin>>a_s>>b_s; //接收两个整数 a, b 
	
	len_a=a_s.length();//分别计算长度 
	len_b=b_s.length();
	
	for(i=0;i0) len--; // 去除前缀无用的 0 
	
	for(i=len;i>=0;i--){ //倒序输出 
		cout<

高精度除##

老手来看,新手学学(高精度除法)-CSDN博客

#include 
using namespace std;
 
const int MAXN = 300+4; //根据题目的最大值。+4为了防止A+B出现进位
char s1[MAXN] = {};//存储字符串
char s2[MAXN] = {};//存储字符串
int tmp[MAXN] = {};//交换用字符串
int a[MAXN] = {};//存储加数A
int b[MAXN] = {};//存储加数B
int c[MAXN] = {};//存储和B
 
int compare(int a[], int b[]) {
    //索引为0的数据为数组长度
    if (a[0]>b[0]) {
        return 1;
    } else if (a[0]0; i--) {
        if (a[i]>b[i]) {
            return 1;
        } else if (a[i]0; i--) {
            memset(tmp, 0, sizeof(tmp));
            //高位对齐
            numcpy(b,tmp,i);
 
            //
            while (compare(a, tmp)>=0) {
                c[i]++;
                //减法
                for (int j=1; j<=a[0]; j++) {
                    if (a[j]0 && c[c[0]]==0) {
            c[0]--;
        }
    }
 
    //逆序打印输出商和余数
    for (int i=c[0]; i>0; i--) {
        printf("%d", c[i]);
    }
    printf("\n");
    if (0==a[0]) {
        printf("0\n");
    } else {
        if (true==flaga) {
            printf("-");
        }
        for (int i=a[0]; i>0; i--) {
            printf("%d", a[i]);
        }
        printf("\n");
    }
 
    return 0;
}

打代码不易,给个三连吧

你可能感兴趣的:(c++,算法,数据结构)