Problema de cálculo de alta precisión

Adición de alta precisión

Descripción
Encuentre la suma de dos números enteros no negativos con no más de 200 dígitos.


Hay dos líneas de entrada , cada línea es un número entero no negativo con no más de 200 dígitos y puede haber ceros iniciales adicionales.
Salida de
una línea, que es el resultado de la suma. No puede haber un 0 a la izquierda adicional en el resultado, es decir, si el resultado es 342, no se puede generar como 0342.
Entrada de muestra
22222222222222222222
33333333333333333333
Salida de muestra
55555555555555555555

//题解:高精度入门题:结构体+字符转换+进位 
#include<cstdio>
#include<cstring>
struct nod{
    
    int n,a[210];nod(){
    
    memset(a,0,sizeof(a));}}a,b;
char s[210];
int main()
{
    
    
    int ns;//读入a============ 
    scanf("%s",s+1);//下标从1开始 
    ns=strlen(s+1);    a.n=ns;
    for(int i=1;i<=ns;i++)//字符逆序转换为数字 
    {
    
    //为了数位 对齐,翻转数字 
        a.a[ns-i+1]=s[i]-'0';
    }//========================
    
    //读入b==================== 
    scanf("%s",s+1);//下标从1开始 
    ns=strlen(s+1);    b.n=ns;
    for(int i=1;i<=ns;i++)//字符逆序转换为数字 
    {
    
    //为了数位 对齐,翻转数字 
        b.a[ns-i+1]=s[i]-'0';
    }//=========================
    //模拟加法运算 
    a.n=a.n>b.n?a.n:b.n;//确定数位 
    for(int i=1;i<=a.n;i++)//暴力加 
    {
    
    
        a.a[i]+=b.a[i];
    }
    for(int i=1;i<=a.n;i++)//处理进位 
    {
    
    
        if(a.a[i]>9)
        {
    
    
            a.a[i+1]+=a.a[i]/10;//向右进位 
            a.a[i]%=10;//保留个位数
            if(i==a.n) a.n++;//最高位溢出 
        }
    }
    //消除前导0
    while(a.a[a.n]==0&&a.n>1) a.n--;//最高位必须非0
    //反向输出
    for(int i=a.n;i>=1;i--)
    {
    
    
        printf("%d ",a.a[i]);
    } 
    return 0;
}
 

Resta de alta precisión

Descripción
Calcula la diferencia de la resta de dos números enteros positivos grandes.

Ingrese
un total de 2 líneas, la primera línea es la a restada y la segunda línea es la b restada (a> b). Cada entero grande no supera los 200 bits y no habrá ceros iniciales adicionales.
Salida de
una línea, es decir, la diferencia requerida.
Entrada de muestra
999999999999999999999999999999999999999
9999999999999
Salida de muestra
9999999999999999999999990000000000000

//题解:高精度入门题:结构体+字符转换+借位 
#include<cstdio>
#include<cstring>
struct nod{
    
    int n,a[210];nod(){
    
    memset(a,0,sizeof(a));}}a,b;
char s[210];
int main()
{
    
    
    int ns;//读入a============ 
    scanf("%s",s+1);//下标从1开始 
    ns=strlen(s+1);    a.n=ns;
    for(int i=1;i<=ns;i++)//字符逆序转换为数字 
    {
    
    //为了数位 对齐,翻转数字 
        a.a[ns-i+1]=s[i]-'0';
    }//========================
    //读入b==================== 
    scanf("%s",s+1);//下标从1开始 
    ns=strlen(s+1);    b.n=ns;
    for(int i=1;i<=ns;i++)//字符逆序转换为数字 
    {
    
    //为了数位 对齐,翻转数字 
        b.a[ns-i+1]=s[i]-'0';
    }//=========================
    //模拟减法运算  
    for(int i=1;i<=a.n;i++) a.a[i]-=b.a[i];//暴力减 
    for(int i=1;i<=a.n;i++)//处理借位 
    {
    
    
        if(a.a[i]<0)
        {
    
    
            a.a[i+1]-=1;//向右借 1 
            a.a[i]+=10;//补充数值 
        }
    }
    //消除前导0//本题保证a>b,如果不知道大小关系呢? 
    while(a.a[a.n]==0&&a.n>1) a.n--;//最高位必须非0
    //反向输出
    for(int i=a.n;i>=1;i--) printf("%d",a.a[i]);
    return 0;
}

Multiplicación de alta precisión

Alta precisión * baja precisión

Descripción
Dado un entero positivo N (N <= 100), calcule el valor de 2 elevado a n.
Ingrese
Ingrese un número entero positivo N.
Salida
Emite el valor de 2 elevado a la enésima potencia.
Entrada
de
muestra 5 Salida de muestra
32

//题解:高精度*低精度 +非结构体 +函数 
#include<cstdio>
int a[1010],na;//估算数组,2的100次不知道是多少位?
//10的100次是1000位,可以了吗?
void cf(int x)
{
    
    
    for(int i=1;i<=na;i++)//每位都乘 
    {
    
    
        a[i]*=x;
    }
    for(int i=1;i<=na;i++)//处理进位 
    {
    
    
        if(a[i]>9)
        {
    
    
            a[i+1]+=a[i]/10;
            a[i]%=10;
            if(i==na) na++;//最高位溢出 
        }
    }
}
int main()
{
    
    
    int n;
    scanf("%d",&n);
    a[1]=1;na=1;
    for(int i=1;i<=n;i++)
    {
    
    
        cf(2);
    }
    for(int i=na;i>=1;i--) printf("%d",a[i]);//反向输出 
    
    //现在你可以知道2的100次方是多少位了吗? 
    
    return 0;
}
 

División de alta precisión

Alta precisión / baja precisión

Descripción
Sabiendo que el entero positivo k satisface 2 <= k <= 9, ahora dado un entero decimal no negativo c con una longitud máxima de 30 dígitos, encuentre todos los k que puedan dividir c uniformemente.

Ingrese
un número entero no negativo c, el número de dígitos de c es <= 30.
Salida
Si hay k que satisface c% k == 0, genere todos esos k de pequeño a grande, separados por un solo espacio entre dos números adyacentes; si no hay tal k, dé salida "ninguno".
Entrada
de
muestra 30 Salida de muestra
2 3 5 6

//题解:高精度除以低精度:模拟思想 
#include<cstdio>
#include<cstring>
char s[210];
int a[210],na,ls=0; 
void chu(int x)
{
    
    
    int k=0;//余数 
    for(int i=na;i>=1;i--)//模拟竖式除法 
    {
    
    
        k=k*10+a[i];
        k=k%x;
    }
    if(k==0) 
    {
    
        ls=1; //打标签 
        printf("%d ",x);
    } 
}
int main()
{
    
    
    int ns;
    scanf("%s",s+1);//下标从1开始 
    ns=strlen(s+1);    na=ns;
    for(int i=1;i<=ns;i++)//字符逆序转换为数字 
    {
    
    
        a[ns-i+1]=s[i]-'0';
    }
    for(int i=2;i<=9;i++)
    {
    
    
        chu(i);//函数处理 
    }
    if(ls==0) printf("none"); 
    return 0;
}
 

Supongo que te gusta

Origin blog.csdn.net/weixin_44972129/article/details/111059298
Recomendado
Clasificación