高精度大数相加

下面的代码是我自己想出来的,可能有点麻烦

# include 
# include 

# define MAX 5005

int num1[MAX];
int num2[MAX];
int sum[MAX];

int main(void)
{
	char ch1[MAX];
	char ch2[MAX];
	int i, j;
	while (scanf("%s %s", ch1, ch2) != EOF)
	{
		memset(num1, 0, sizeof(num1));
		memset(num2, 0, sizeof(num2));
		memset(sum, 0, sizeof(sum));
		int len1 = strlen(ch1);
		int len2 = strlen(ch2);
		int flag1 = 0;
		int flag2 = 0;
		for (i = 0; i < len1; i ++)
		{
			if (ch1[i] == '.')
			{
				flag1 = len1 - 1 - i;//记录num1的小数点位置
			}
		}
		for (i = 0; i < len2; i ++)
		{
			if (ch2[i] == '.')
			{
				flag2 = len2 - 1 - i;//记录num2的小数点位置
			}
		}
		int pos = flag1 > flag2 ? flag1 - flag2 : flag2 - flag1;
		/*以小数点为中心,进行对齐*/
		if (flag1 > flag2)
		{
			for (i = len1 - 1, j = 0; i >= 0; i --)
			{
				if (ch1[i] != '.')
				{
					num1[j++] = ch1[i] - '0';
				}
			}
			for (i = len2 - 1, j = pos; i >= 0; i --)
			{
				if (ch2[i] != '.')
				{
					num2[j++] = ch2[i] - '0';
				}
			}
		}
		else
		{
			for (i = len2 - 1, j = 0; i >= 0; i --)
			{
				if (ch2[i] != '.')
				{
					num2[j++] = ch2[i] - '0';
				}
			}
			for (i = len1 - 1, j = pos; i >= 0; i --)
			{
				if (ch1[i] != '.')
				{
					num1[j++] = ch1[i] - '0';
				}
			}
		}
		/*
		for (i = 0; i < len1; i++)
		{
			printf("%d", num1[i]);
		}
		printf("\n");
		for (i = 0; i < len2; i++)
		{
			printf("%d", num2[i]);
		}
		printf("\n");
		*/
		int c = 0;
		int s = 0;
		for (i = 0; i <= len1 + len2; i++)
		{
			s = num1[i] + num2[i] + c;
			sum[i] = s % 10;
			c = s / 10;
		}
		for (i = len1 + len2 + 1; i >= 0; i--)
		{
			if (sum[i] != 0)
			{
				break;
			}
		}
		for (j = 0; j < len1 + len2 + 1; j ++)
		{
			if (sum[j] != 0)
			{
				break;
			}
		}
	//	printf("i = %d\n", i);
	//	printf("j = %d\n", j);
		if (i == -1)
		{
			printf("0\n");
			continue;
		}
		int flag = flag1 > flag2 ? flag1 : flag2;
	//	printf("flag = %d\n", flag);
		/*以下是判断小数点的输出位置以及是否需要输出小数点*/
		if (flag == 0)
		{
			for (; i >= 0; i--)
			{
				printf("%d", sum[i]);
			}
			printf("\n");
		}
		else
		{
			if (flag > i)
			{
				printf(".");
				for (i = flag; i >= j; i--)
				{
					printf("%d", sum[i]);
				}
				printf("\n");
			}
			else if (flag == i)
			{
				if (j < flag)
				{
					printf("%d", sum[i]);
					printf(".");
					for (i = flag -1 ; i >= j; i--)
					{
						printf("%d", sum[i]);
					}
					printf("\n");
				}
				else
				{
					printf("%d\n", sum[i]);
				}
			}
			else
			{
				if (flag > j)
				{
					for (; i >= flag; i--)
					{
						printf("%d", sum[i]);
					}
					printf(".");
					for (i = flag-1; i >= j; i--)
					{
						printf("%d", sum[i]);
					}
					printf("\n");
				}
				else if (flag == j)
				{
					for (; i >= j; i --)
					{
						printf("%d", sum[i]);
					}
					printf("\n");
				}
				else
				{
					for (; i >= flag; i--)
					{
						printf("%d", sum[i]);
					}
					printf("\n");
				}
			}


		}
	}
	return 0;
}


你可能感兴趣的:(高精度大数相加)