YTUOJ 2310: Operación de cadena cuatro (cadena)

Descripción de la pregunta

Ingrese un decimal en forma de cadena, elimine su precisión y hágalo con una precisión de 2 dígitos después del punto decimal. Hay varios conjuntos de datos de prueba, de entrada y de salida al mismo tiempo.

Entrada de muestra

20


1,23

2,555

2,534

1,22222222

Salida de muestra

20,00

1,23

2,56

2,53

1,22

Esta pregunta no es complicada, lo principal es considerar detenidamente los diversos resultados.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    
    
	char a[120];
	int i,n,point=0,l;
	while(gets(a))
	{
    
    
		l=strlen(a);
		for(i=0;i<l;i++) //寻找小数点位置
		{
    
    
			if(a[i]=='.')
			{
    
    
				point=i;
				break;
			}
		}
		if(i==l)
			point=0;
		printf("---%d\n",point);
		if(point==0) //最简单的情况//没有小数点的情况,直接输出,后加.00   
		{
    
    
			printf("%s.00\n",a);
		}
		else //有小数点需要分好几种情况处理
		{
    
    
			//当数字为XX.99Y这种情况,及进一位为XX.00/
			if(a[point+1]=='9' && a[point+2]=='9' && a[point+3]>='5') 
			{
    
    
				//a[point-1] = (a[point-1]+1)%10;
				for(i=point-1;i>=0;i--)
				{
    
    
					a[i] = a[i]+1;
					if(a[i]!='9'+1)
						break;
					else
						a[i]='0';
				}
				for(i=0;i<=point;i++)
					printf("%c",a[i]);
				printf("00\n");
			}
			
			else if(a[point+2]=='\0') // 即只有一位小数的情况
			{
    
    
				for(i=0;a[i]!='\0';i++)
					printf("%c",a[i]);
				printf("0\n");
			}
			else //普通情况
			{
    
    
				for(i=l-1;i>point+2;i--)  
				{
    
    
					if(a[i]>='5')
					{
    
    
						if(a[i-1]<='8')
							a[i-1] += 1;
						else
							a[i-1] = '0';
					}
				}
				for(i=0;i<=point+2;i++)
					printf("%c",a[i]);
				printf("\n");
			}
		}
		printf("\n");
		getchar();
	}
	system("pause");
	return 0;
}

Aunque se entregó AC, después de pensarlo, descubrí que este código tiene un error. Si un número es x.994Yxxxxx y si el valor de Y es 5 después del procesamiento normal, es necesario aumentarlo aún más. La respuesta correcta debe ser (x+1) .00, mientras que el código anterior genera x.90.

Después de pensarlo, se me ocurrió una solución: como no usé funciones, recursividad y otros métodos al principio, sino que simplemente los puse todo en la función principal, fue un poco problemático aquí.

La idea es la siguiente:

Después del procesamiento normal, agregue un paso para determinar si es x.90Y. Si Y>=5, se necesita un acarreo. La respuesta correcta debería ser (x+1).00

El código se muestra a continuación:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    
    
	char a[120];
	int i,n,point=0,l;
	while(gets(a))
	{
    
    
		l=strlen(a);
		for(i=0;i<l;i++) //寻找小数点位置
		{
    
    
			if(a[i]=='.')
			{
    
    
				point=i;
				break;
			}
		}
		if(i==l)
			point=0;
		//printf("---%d\n",point);
		if(point==0) //最简单的情况//没有小数点的情况,直接输出,后加.00   
		{
    
    
			printf("%s.00\n",a);
		}
		else //有小数点需要分好几种情况处理
		{
    
    
			//当数字为XX.99Y这种情况,及进一位为XX.00/
			if(a[point+1]=='9' && a[point+2]=='9' && a[point+3]>='5') 
			{
    
    
				//a[point-1] = (a[point-1]+1)%10;
				for(i=point-1;i>=0;i--)
				{
    
    
					a[i] = a[i]+1;
					if(a[i]!='9'+1)
						break;
					else
						a[i]='0';
				}
				for(i=0;i<=point;i++)
					printf("%c",a[i]);
				printf("00\n");
			}
			
			else if(a[point+2]=='\0') // 即只有一位小数的情况
			{
    
    
				for(i=0;a[i]!='\0';i++)
					printf("%c",a[i]);
				printf("0\n");
			}
			else //普通情况
			{
    
    
				for(i=l-1;i>point+2;i--)  
				{
    
    
					if(a[i]>='5')
					{
    
    
						if(a[i-1]<='8')
							a[i-1] += 1;
						else
							a[i-1] = '0';
					}
				}
				///
				//此部分为增加的判断
				if(a[point+1]=='9' && a[point+2]=='0' && a[point+3]>='5') 
				{
    
    
					//a[point-1] = (a[point-1]+1)%10;
					for(i=point-1;i>=0;i--)
					{
    
    
						a[i] = a[i]+1;
						if(a[i]!='9'+1)
							break;
						else
							a[i]='0';
					}
					for(i=0;i<=point;i++)
						printf("%c",a[i]);
					printf("00\n");
				}
				else
				{
    
    
					for(i=0;i<=point+2;i++)
						printf("%c",a[i]);
					printf("\n");
				}
				//
			}
		}
		printf("\n");
		getchar();
	}
	//system("pause");
	return 0;
}

La situación de operación es la siguiente, todas las situaciones son consistentes con el significado de la pregunta.
Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/u014295602/article/details/103281175
Recomendado
Clasificación