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类型 { 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=%dn", a, b, k =a + b); break; case 'b': printf("%d-%d=%dn", a, b, k =a - b); break; case 'c': printf("%d*%d=%dn", 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("%dn", 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=%dn", a, b, k = a + b); break; case 'b': printf("%d-%d=%dn", a, b, k = a - b); break; case 'c': printf("%d*%d=%dn", 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)



