Suma y multiplicación en lenguaje C de números grandes (números de alta precisión)

Suma y multiplicación de números grandes (números de alta precisión)

prefacio

El tipo y tamaño de los números están claramente especificados en el lenguaje C, pero en algunos casos, el tipo int o long no puede cumplir con los requisitos de datos, por lo que necesitamos encontrar otros métodos para calcular estos números.


Suma de números de alta precisión.

Análisis:
en este momento, el rango del número excede el rango entero máximo, entonces, ¿qué método debemos usar para almacenar este número?
Primero pensamos en matrices , que pueden almacenar cada número de un número entero con cada elemento de una matriz de caracteres; de modo que podamos almacenar dos números en nuestras dos cadenas.
Antes de realizar la operación es necesario aclarar los siguientes puntos:

1. Para convertir caracteres a números, reste '0'; para convertir números a caracteres, agregue '0'; (aquí está el código ascll)

2. Tener consideración

3. Lleve el juicio al nivel más alto

¡Con estos fundamentos, podemos intentar escribir código!

//直接对字符数组进行操作
#include<stdio.h>
#include<string.h>
#define max 200 
int main()
{
    
    
	int i, j, m, n, k;
	//创建两个字符数组存放这两个数字 
	char a[max], b[max];
	
	//分别读取 
	scanf("%s", a);
	scanf("%s", b); 
	
	//分别计算数组的长度(位数) 
	m = strlen(a); 
	k = n = strlen(b);
	
	//取最大位数k
	if(m > k) k = m; 
	
	// 最大数字的最后一位的下一位为字符‘0’作为读取时结束标志 
	a[k + 1] = 0;
	
	//将数字整体后移,使得两个数的对应位数对齐 
	for(i = 0; i < k; i++){
    
    
		a[k-i] = a[m-i-1];
	}
	//将其前面空余位置补字符0 
	for(i = 0; i <= k - m; i++){
    
    
		a[i] = '0';
	}
	for(i = 0; i < k; i++){
    
    
		b[k - i] = b[n - i - 1];
	}
	for(i = 0; i <= k - n;i++){
    
    
		b[i] = '0';
	}
	
	j = 0;//作为两个数字对应位数的进位和,初始化为0 
	for(i = 0; i < k; i++){
    
    
		j = (a[k - i] + b[k - i] + j - 96);//96是两个字符‘0’的 ascll码的和 ,目的是将其转化为数字形式 
		a[k - i] = j % 10 + 48;//将所得数字和赋给字符数组a相应的位数 
		j = j / 10;//取进位 
	}
	a[0] = j + 48;//防止两数字之和的位数 比 最大数字的位数还大 
	if(a[0] == '0'){
    
    
		printf("%s\n", a + 1);//没有进位的话,就从数组的第二个元素开始输出 
	}else{
    
    
		printf("%s\n", a);
	}
}

Multiplicación de números de alta precisión.

También es necesario prestar atención a los siguientes puntos:

1. Para convertir caracteres a números, reste '0'; para convertir números a caracteres, agregue '0'; (aquí está el código ascll)

2. Tener consideración

3. Lleve el juicio al nivel más alto

Pero en este momento necesitamos una tercera matriz para almacenar la respuesta. Me pregunto si todavía recuerdas la fórmula de multiplicación vertical en la escuela primaria, pero habrá algunos cambios aquí (aquí no manejamos la operación de acarreo ).

             3   2   1
*            4   5   6
*--------------------------
             4   5   6
        8   10  12
   12  15   18   
*--------------------------
   12  23   32  17   6
   **所得乘积数字的位数最大只能是两个数字的位数和**

Una observación cuidadosa revela:

	c[0]=a[0]+b[0];
	c[1]=a[0]*b[1]+a[1]*b[0];
然后我们就可以得到一个规律:
	c[i+j]+=a[i]*b[j];
#include<stdio.h>
#include<string.h>
#define max 1500
int main() {
    
    
    char c1[max], c2[max];
    scanf("%s%s", c1, c2);
    int n = strlen(c1), m = strlen(c2);
    int a[n], b[m];
    int i, j;
    //将得到的字符串转化为数字 
    for (i = 0, j = n - 1; i < n; i++, j--) {
    
    
        a[i] = c1[j] - '0';
    }
    for (i = 0, j = m - 1; i < m; i++, j--) {
    
    
        b[i] = c2[j] - '0';
    }
    
    int c[max + max];
    for (i = 0; i < max + max; i++) {
    
    
        c[i] = 0;
    }
    //将相乘的结果存放在c中 
    for (i = 0; i < n; i++) {
    
    
        for (j = 0; j < m; j++) {
    
    
            c[i + j] += a[i] * b[j];
        }
    }   
    //进行进位操作 
    for (i = 0; i < n + m; i++) {
    
    
        if (c[i] >= 10) {
    
    
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
    //将多余位数的0跳过 ,开始输出。 
    for (j = max + max - 1; j > 0; j--) {
    
    
        if (c[j] != 0){
    
    
        	break;
		}    
    }
    for (i = j; i >= 0; i--) {
    
    
    	printf("%d", c[i]);
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/The_onion/article/details/121576859
Recomendado
Clasificación