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