本地测试全正常,洛谷全wa

P1957 口算练习题

snemc @ 2022-11-29 11:33:07

本地测试全正常,洛谷全wa

上代码

#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行 读入的 x 有可能是存在前导零的,但是很明显程序会忽略前导0


|