HDU-1753 Daming A + B (operación de gran número de alta precisión)

En otras palabras, después de un largo mes, Xiao Ming ha crecido mucho, así que cambió su nombre a "Da Ming".
En este momento, ya no es el "Xiao Ming" que solo puede sumar dentro de 100, y ahora incluso puede sumar decimales positivos de cualquier longitud.

Ahora, dados dos decimales positivos, A y B, su tarea es calcular el valor de A + B en nombre de Daming.
Entrada
Esta pregunta contiene varios conjuntos de datos de prueba, procese hasta el final del archivo.
Cada conjunto de datos de prueba contiene dos decimales positivos A y B cuya longitud no es mayor de 400 en una línea.
Salida
Genere el valor de A + B en una línea, genere la forma más simple. Consulte Salida de muestra para conocer los requisitos detallados.
Entrada de muestra
1.1 2.9
1.1111111111 2.3444323343
1 1.1
Salida de muestra
4
3.4555434454
2.1 Idea
de resolución de problemas:
encuentre el punto decimal para separar la parte entera de la parte decimal,
calcule la parte decimal y luego la parte entera (para evitar que la parte decimal se lleve ) El
proceso de cálculo es el mismo que el de la suma de números grandes (parte decimal) Preste atención a 0 si la cantidad de dígitos es pequeña)
Utilice la matriz para almacenar el número y luego simule la suma en orden inverso
, preste atención a juzgar si el punto decimal existe

#include<stdio.h>
#include<string.h>
char s1[500],s2[500];
int a[500],b[500],c[500],d[500];
int main(){
    
    
	int i,j,k,len1,len2,s,t,kk1,kk2;
	while(scanf("%s %s",s1,s2)!=EOF)
	{
    
    
		//别忘了初始化 
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		memset(d,0,sizeof(d));
	len1=strlen(s1);
	len2=strlen(s2);
	s=len1;
	t=len2; 
	//找到小数点位置 
	for(i=0;i<len1;i++)
	  if(s1[i]=='.')
	  {
    
    
	  	s=i;
		  break;
	  }
	for(i=0;i<len2;i++)
	 if(s2[i]=='.')
	 {
    
    
	 	t=i;break;
	}
	
	//小数部分 //先算小数部分防止有进位  
	k=1;
	if(s+1<len1)
	  for(j=s+1;j<=len1-1;j++)
	    c[k++]=s1[j]-'0';
	k=1;
	if(t+1<len2)
	  for(j=t+1;j<=len2-1;j++)
	   d[k++]=s2[j]-'0';  
	kk1=len1-s;
	if(len2-t>kk1)
		kk1=len2-t;
	for(i=kk1;i>=1;i--)
	{
    
    
		c[i]+=d[i];
		if(c[i]>=10)
		{
    
    
			c[i]-=10;
			c[i-1]++;
		}
	} 
	//整数部分 
	 k=0;
	 for(j=s-1;j>=0;j--)
	   a[k++]=s1[j]-'0';
	 k=0;
	 for(j=t-1;j>=0;j--)
	   b[k++]=s2[j]-'0';
	kk2=s-1;
	if(t-1>kk2)
		kk2=t-1;
	a[0]+=c[0];//小数进位 
	for(i=0;i<=kk2;i++){
    
    
		a[i]+=b[i];
		if(a[i]>=10)
		{
    
    
			a[i]-=10;
			a[i+1]++;
		}
	} 
	//输出整数部分 
	if(a[kk2+1])
	   printf("%d",a[kk2+1]);
	for(i=kk2;i>=0;i--)
	   printf("%d",a[i]);  
	//输出小数部分	
	for(i=kk1;i>=1;i--)
		if(c[i])
		break;
	if(i)//判断是否有小数 
	{
    
    
		printf(".");
	for(j=1;j<=i;j++)
	   printf("%d",c[j]);
	}
	printf("\n");
}
return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_46703995/article/details/113012017
Recomendado
Clasificación