snemc @ 2022-11-29 11:33:07
上代码
#include <stdio.h>
int i,x,y;
char fh;
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int main()
{
int (*arr[3])(int, int) = {add, sub, mul}; // 定义一个函数指针数组
char brr[3] = {'+', '-', '*'}; // 定义一个字符数组
int (*p)(int, int) = arr[0]; // 定义一个可以变化的函数指针
int i; // 读入i,
scanf("%d", &i);
char fh,c; // 记录符号,和符号字符
scanf("%c", &fh); // 读入换行符号
// p = arr[fh - 'a'];
// char c = brr[fh - 'a'];
while(i--){
scanf("%c", &fh); // 读取一个符号,有可能是一个数字,或者一个符号
if(fh == 'a' || fh == 'b' || fh == 'c'){ // 如果是符号
p = arr[fh - 'a'];
c = brr[fh - 'a']; // 更新 函数指针和 符号
scanf("%d%d", &x, &y); // 更新,x,y的值
}else{ // 读入一个符号不是符号
int t = (int)(fh - '0'); // 获取这个数字的值
scanf("%d%d", &x, &y); // 更新x,y ,x需要单独处理
int m = x; // 让m替换x,处理m,需要保留x的值
while(m){
t *= 10;
m /= 10;
}
x = x + t; // 获取x真正的值
}
int k = printf("%d%c%d=%d\n", x, c, y, p(x, y)); // k记录打印的字符数,printf额外的功能
printf("%d\n", k - 1);// 会多记录一个换行符号,去掉
scanf("%c", &fh); // 读取换行符号
}
return 0;
}
使用了函数指针写法,看了大家的题解目前还没有这样写过的 不明白洛谷的评测机制怎么样, 题目要求要打印算式的长度,我写的时候没有看到这一点,但在最后写的时候突然想到printf好像有个返回值记录打印字符的个数,我就直接利用了这个返回值, 本地测试一下似乎没有问题,但是洛谷已提交全部wa
by WZWZWZWY @ 2022-11-29 12:12:58
你应该在洛谷的IDE上试试QAQ
@snemc
by Jorylee @ 2022-11-29 12:20:40
#include <stdio.h>
int i,x,y;
char fh;
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int main()
{
int (*arr[3])(int, int) = {add, sub, mul}; // 定义一个函数指针数组
char brr[3] = {'+', '-', '*'}; // 定义一个字符数组
int (*p)(int, int) = arr[0]; // 定义一个可以变化的函数指针
int i; // 读入i,
scanf("%d", &i);
char fh,c; // 记录符号,和符号字符
// p = arr[fh - 'a'];
// char c = brr[fh - 'a'];
while(i--){
scanf(" %c", &fh); // 读取一个符号,有可能是一个数字,或者一个符号
if(fh == 'a' || fh == 'b' || fh == 'c'){ // 如果是符号
p = arr[fh - 'a'];
c = brr[fh - 'a']; // 更新 函数指针和 符号
scanf("%d%d", &x, &y); // 更新,x,y的值
}else{ // 读入一个符号不是符号
int t = (int)(fh - '0'); // 获取这个数字的值
scanf("%d%d", &x, &y); // 更新x,y ,x需要单独处理
int m = x; // 让m替换x,处理m,需要保留x的值
while(m){
t *= 10;
m /= 10;
}
x = x + t; // 获取x真正的值
}
int k = printf("%d%c%d=%d\n", x, c, y, p(x, y)); // k记录打印的字符数,printf额外的功能
printf("%d\n", k - 1);// 会多记录一个换行符号,去掉
}
return 0;
}
改成这样可以获得90分 提交记录
具体来说就是在scanf
的%c
前面添加
(空格)来自动忽略空格换行之类的不可见字符.
问题可能出在 在 windows 下 换行是 \r\n
是两个字符,.
剩下的问题就是对于第31-36行 读入的