2022.3.27 15:10 洛谷P1957

2022.3.27 15:10 洛谷P1957,第1张

C:(100分)

这个底层真的搞死我了

整体构思了挺久,细节方面也抠了很久,吐了

#define _CRT_SECURE_NO_WARNINGS 1

#include 


#define Max 20  // 定义 可接收的单个字符串 的最大长度


int mypow(int a)  //用于获得10的次方,如输入0返回1,如输入1返回10,如输入2返回100
{
	int b = 1;

	if (a == 0)
	{
		return b;
	}
	else
	{
		for (int i = 1; i <= a; i++)
		{
			b *= 10;
		}
	}

	return b;
}


void arr1_chushihua(char* arr1)  //用于初始化数组arr1
{
	int i = 0;

	while (arr1[i] != 0)
	{
		arr1[i++] = 0;
	}
}


int num_turn_int(char* arr1)  //用于两个数组 从 字符串 变成 int类型
{
	/*
	思路是:
	1. 先 遍历 找到 个位数 在 数组arr1 的下标
	2. 然后从 0, 即最大位, 一直加到 个位
	
	技巧:通过 i - k 得到 当前为 什么位(个位百位千位)
	*/

	int l = 0;

	for (int i = Max - 1; i >= 0; i--)
	{
		if (arr1[i] != 0)
		{
			for (int k = 0; k <= i; k++)
			{
				l += (arr1[k] - '0') * (mypow(i - k));
			}

			break;
		}
	}

	return l;
}


void printall(char fu, int a, int b)  //用于 两数字的运算 以及 打印输出
{
	int chang = 2;  //是最后 “运算式的总长度”.由于该题运算式中,运算符 和 等于号 是绝对有的,所以一开始chang = 2

	int k = 0;  //用于储存 两数运算 的结果

	switch (fu)
	{
	case 'a':
		printf("%d+%d=%d\n", a, b, k =a + b);

		break;

	case 'b':
		printf("%d-%d=%d\n", a, b, k =a - b);

		break;

	case 'c':
		printf("%d*%d=%d\n", a, b, k = a * b);

		break;

	}


	if (k < 0)
	{
		chang++;
	}


	while (1)  //判断 第一个数字 的长度
	{
		a /= 10;

		chang++;

		if (a == 0)
		{
			break;
		}
	}

	while (1)  //判断 第二个数字 的长度
	{
		b /= 10;

		chang++;

		if (b == 0)
		{
			break;
		}
	}

	while (1)  //判断 运算结果 的长度
	{
		k /= 10;

		chang++;

		if (k == 0)
		{
			break;
		}
	}

	printf("%d\n", chang);
}


int main()
{
	char arr1[Max] = { 0 };  //用于存放 接收的 未处理的字符串

	int arr2[2] = { 0 };  //用于存放 两个数字,下标为 0 的位置存放第一个数字,下标为 1 的位置存放第二个数字

	int c = 1;  //要进行运算的 数字 个数,本题中 数字 最多为两个

	int i = 0;  //用于储存 “需要输入的算式”

	char fu = ' ';  //用于存放 运算符

	scanf("%d", &i);

	for (int n = 1; n <= i; n++)
	{
		while (scanf("%s", arr1))
		{
			if (arr1[0] == 'a' || arr1[0] == 'b' || arr1[0] == 'c') 
			{
				fu = arr1[0];  //改变 运算符

				arr1_chushihua(arr1);  //初始化 数组arr1

				continue;
			}
			else
			{
				arr2[c - 1] = num_turn_int(arr1);

				arr1_chushihua(arr1);  //初始化 数组arr1

				if (c == 2)  //两个数字 都 处理完了
				{
					printall(fu, arr2[0], arr2[1]);  //输出结果

					c = 1; //初始化c

					break;
				}

				c++;
			}
		}
	}

	return 0;
}

C++:(100分)

 整体思路和C差不多,在原来C的基础上运用了一些函数

看了其他大佬的,发现可以用sprintf,不过还是懒得改了

#define _CRT_SECURE_NO_WARNINGS 1

#include 

#include 

#include 

#include 

using namespace std;


void printall(char fu, string arr2[])  //用于 两数字的运算 以及 打印输出
{
	int chang = 2;  //是最后 “运算式的总长度”.由于该题运算式中,运算符 和 等于号 是绝对有的,所以一开始chang = 2

	int k = 0;  //用于储存 两数运算 的结果

	int a = atoi(arr2[0].c_str());

	int b = atoi(arr2[1].c_str());

	switch (fu)
	{
	case 'a':
		printf("%d+%d=%d\n", a, b, k = a + b);

		break;

	case 'b':
		printf("%d-%d=%d\n", a, b, k = a - b);

		break;

	case 'c':
		printf("%d*%d=%d\n", a, b, k = a * b);

		break;
	}


	if (k < 0)
	{
		chang++;
	}

	while (1)  //判断 运算结果 的长度
	{
		k /= 10;

		chang++;

		if (k == 0)
		{
			break;
		}
	}

	cout << chang + strlen(arr2[0].c_str()) + strlen(arr2[1].c_str()) << endl;
}


int main()
{
	string arr1 = { 0 };  //用于存放 接收的 未处理的字符串

	string arr2[2];  //用于存放 两个数字,下标为 0 的位置存放第一个数字,下标为 1 的位置存放第二个数字

	int c = 1;  //要进行运算的 数字 个数,本题中 数字 最多为两个

	int i = 0;  //用于储存 “需要输入的算式”

	char fu = ' ';  //用于存放 运算符

	cin >> i;

	for (int n = 1; n <= i; n++)
	{
		while (cin >> arr1)
		{
			if (arr1[0] == 'a' || arr1[0] == 'b' || arr1[0] == 'c')
			{
				fu = arr1[0];  //改变 运算符

				arr1 = { 0 };  //初始化 arr1

				continue;
			}
			else
			{
				arr2[c - 1] = arr1;

				arr1 = { 0 };  //初始化 arr1

				if (c == 2)  //两个数字 都 处理完了
				{
					printall(fu, arr2);  //输出结果

					c = 1; //初始化c

					break;
				}

				c++;
			}
		}
	}

	return 0;
}

python: (0分)

算法应该是没什么大问题的,但是不知道为什么直接复制输入的话总会卡一下,一直停留在最后一行的输入界面,初步推测是因为输入的最后一行屁股后面少了一个换行符,但这个换行符没有办法补的,只好作罢了

不是答案,仅思路可以参考

i = int(input(""))

fu_biao = {"a":"+", "b":"-", "c":"*"} # 运用字典

fu = ' '

for n in range(0, i):
    a = input("").split(" ") # 按 " " 进行标准的分割,最后返回一个列表

    if a[0] == 'a' or a[0] == 'b' or a[0] == 'c':
        fu = a[0]

        a.pop(0)  # 移除掉第一个元素

    left = a[0] + fu_biao[fu] + a[1]  # 三个字符串按顺序加在一起,例 "64" + '+' + "46" 即:“64+46”

    print(f"{left}={eval(left)}")
    # f""表示标准化输出,f""的 "" 可在 {} 捏填写变量,在 {} 内按变量或函数的返回值输出,{} 外的内容正常输出
    # 例: print(f"{a} + {b} = 5")  其中 a = 1, b = 4
    # 最后会打印: 1 + 4 = 5

    #eval() - 作用是去除 () 内 内容 最左边和最右边的 "
    # 如果可能的话会进行运算
    # 例:print(eval("4 + 5"))
    # eval函数运行完后:print(4 + 5)
    # 最后打印:9

    print(len(left +str(eval(left))) + 1)

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/562301.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-01
下一篇 2022-04-01

发表评论

登录后才能评论

评论列表(0条)

保存