洛谷 P1022 计算器的改良 (c语言)

此题没啥特别说的   就是需要特盘一下  解出来为0的值      因为计算器可能就出来是-1

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>

int main()
{
	char arr[100] = { 0 };

	scanf("%s", arr);

	char arr1[100] = { 0 };//  存放未知的系数

	int sum1 = 0;
	int sum2 = 0;
	char zimu = 0;


	int k = 0;
	int a = 0;
	while (arr[k] != '\0')
	{
		if (arr[k] == '=')
			a = k;

		k++;
	}//  a位置就是 等号 的位置
	//   k的位置就是  \0 的位置


	int i = 0;
	int x = 0;







//未知数前面系数的部分
	for (i = 0; i < k; ++i)
	{
		if ((arr[i] >= 'a') && (arr[i] <= 'z'))
		{
			int b = i;
			zimu = arr[i];
			if (i < a)//等式左边的
			{
				if ((arr[i - 1] == '+') || (i - 1 == -1))
				{
					arr1[x] ='1'; arr1[x + 1] = '+';
					x+=2;
				}
				else if(arr[i-1]=='-')
				{
					arr1[x] = '1'; arr1[x + 1] = '-';
					x+=2;
				}
				else
				{
					while (1)
					{
						arr1[x] = arr[b - 1];
						if ((arr[b - 2] == '+') || (b - 2 == -1))

						{
							arr1[x + 1] = '+'; x += 2; break;
						}

						else if (arr[b - 2] == '-')

						{
							arr1[x + 1] = '-'; x += 2; break;
						}
						else
						{
							x++;
							b--;
						}

					}



				}
			}


			else  //等式右边的
			{
				if ((arr[i - 1] == '+')||(arr[i-1]=='='))
				{
					arr1[x] = '1'; arr1[x + 1] = '-';
					x += 2;
				}
				else if (arr[i - 1] == '-')
				{
					arr1[x] = '1'; arr1[x + 1] = '+';
					x += 2;
				}
				else
				{
					while (1)
					{
						arr1[x] = arr[b - 1];
						if ((arr[b - 2] == '+') || (arr[b-2]=='='))

						{
							arr1[x + 1] = '-'; x += 2; break;
						}

						else if (arr[b - 2] == '-')

						{
							arr1[x + 1] = '+'; x += 2; break;
						}
						else
						{
							x++;
							b--;
						}

					}



				}
			}

		}

	}

	    x++;
		x++;//空两个各自 区分上下部分
	
			





			//常数部分

		for (i = 0; i <= k; ++i)
		{
			if ((arr[i] == '+') || (arr[i] == '-') || (arr[i] == '=')||(i==k))
			{
				int b = i;
				if (i <= a)//等式左边的
				{
					if ((i - 1 == -1) || ((arr[i - 1] >= 'a') && (arr[i - 1] <= 'z')))
					{
						;
					}
					else
					{
						while (1)
						{
							arr1[x] = arr[b - 1];
							if ((arr[b - 2] == '+') || (b - 2 == -1))

							{
								arr1[x + 1] = '-'; x += 2; break;
							}

							else if ((arr[b - 2] == '-'))

							{
								arr1[x + 1] = '+'; x += 2; break;
							}
							else
							{
								x++;
								b--;
							}

						}



					}
				}


				else  //等式右边的
				{
					{
						if ((arr[i - 1] == '=') || ((arr[i - 1] >= 'a') && (arr[i - 1] <= 'z')))
						{
							;
						}
						else
						{
							while (1)
							{
								arr1[x] = arr[b - 1];
								if ((arr[b - 2] == '+') || (arr[b - 2] == '='))

								{
									arr1[x + 1] = '+'; x += 2; break;
								}

								else if ((arr[b - 2] == '-'))

								{
									arr1[x + 1] = '-'; x += 2; break;
								}
								else
								{
									x++;
									b--;
								}

							}



						}
					}

				}

			}
		}







// 开始计算   i x k 都可用
		i = 0;
		int min = 0, max = 0;
		while (arr1[i] != '\0')

		{
			max = min+1;
			while (1)
			{
				if ((arr1[max] == '+') || (arr1[max] == '-'))
					break;
				max++;
			}
			int jet = min;
			for (k = 0; k <= max-min-1; k++)
			{
				if (arr1[max] == '-')
					sum1 = sum1 - ((arr1[jet] - '0') * pow(10, k));
				else
				sum1 = sum1 + ((arr1[jet] - '0') * pow(10, k));

				jet++;
			}
			min = max + 1;
				i = min;

		}

		i = i + 2;

		min = i;
		while (arr1[i] != '\0')

		{
			max = min + 1;
			while (1)
			{
				if ((arr1[max] == '+') || (arr1[max] == '-'))
					break;
				max++;
			}
			int jet = min;
			for (k = 0; k <= max - min-1; k++)
			{

				if (arr1[max] == '-')
					sum2 = sum2 - ((arr1[jet] - '0') * pow(10, k));
				else
					sum2 = sum2 + ((arr1[jet] - '0') * pow(10, k));

				jet++;
			}
			min = max + 1;
			
			i = min;
		}


		if ((sum2 == 0) || (sum2 == -0))
			printf("a=0.000");
		else
		printf("%c=%.3f",zimu,sum2/1.0/sum1);
		









	return 0;
}

可以继续优化   各位大佬可以来讨论一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值