tommyyu 发表于 2022-9-24 14:06:23

这段代码有什么问题

题目地址: https://www.luogu.com.cn/problem/P1597

我的代码:#include<iostream>
using namespace std;
string n;
int a, b, c;
string get_order() { // 获取指令,并从n中删除这一条指令
        int x = n.find(";");
        string order = n.substr(0, x);
        n.erase(0, x+1);
        return order;
}
int get_number(string num) { // 将字符串转化为数字
        int number = 0;
        for(int i=num.length()-1; i>=0; --i) {
                number *= 10;
                number += (num.c_str() - '0');
        }
        return number;
}
void execute_order(string order) { // 执行指令
        string left = order.substr(0, order.find(":")); //获取等号左边的值
        order.erase(0, order.find("="));
        string rightemp = order;                        //获取等号右边的值
        int right;
        if(rightemp == 'a') right = a;            
        else if(rightemp == 'b') right = b;
        else if(rightemp == 'c') right = c;
        else right = get_number(rightemp);
        if(left == 'a') a = right;                   //赋值
        else if(left == 'b') b = right;
        else if(left == 'c') c = right;
}
int main()
{
        cin>>n;
        while(n.length()) {
                execute_order(get_order());
        }
        cout<<a<<" "<<b<<" "<<c;
        return 0;
}

输入:a:=3;b:=4;c:=5;
输出:43 53 63

请问这是怎么回事{:10_266:}{:10_266:}{:10_266:}

柿子饼同学 发表于 2022-9-24 15:13:34

qwq直接用 scanf 不香嘛

dolly_yos2 发表于 2022-9-24 15:38:20

本帖最后由 dolly_yos2 于 2022-9-24 15:43 编辑

把传入 get_number 函数的参数打印出来试试,您会发现有趣的事情的。
另外这个并不是这段代码的唯一问题,只不过另一个(我发现的)问题由于这道题目的输入限制而恰好被避免掉了。
说到题目的输入限制,这道题目的输入格式非常简单且固定,您编写的代码实际上超出了解决这道题需要的复杂度。每一个赋值语句的格式精确为 < 1 字节变量名>:=<1 字节变量名> | <1 位整数>; ,解析这样的格式可能远不需要您目前的实现方式。
页: [1]
查看完整版本: 这段代码有什么问题