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)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)