9 条题解

  • 7
    @ 2022-3-26 16:08:56

    我们考虑到这题的数据只有 10241024,那么,我们考虑小学时老师教你的:

    你有 22 个苹果,然后你又拿到了 33 个苹果,最后你有 55 个苹果,所以 2+3=52 + 3 = 5 那加法就完成了(代码中的 ushortunsigned short

    short $(ushort x, ushort y) {
    	return std::string().append(x, '.').append(y, '.').length();
    }
    

    那么减法呢?我们知道,xy=x+(y)x - y = x + \left( -y \right),在计算机中,y=y+1-y = \sim y + 1,so,xy=x+y+1x - y = x + \sim y + 1,调用之前写的加法就好:

    short _(short x, short y) {
    	y = ~y;
    	return $($(x, reinterpret_cast<ushort&>(y)), 1);
    }
    

    最后乘法,还是考虑小学的时候老师教你的:

    x×yx \times y 就是 yyxx 相加。

    还是用 string。我们往一个空的 string 里面塞 yy 次长度为 xx 的字符串,然后就好了。
    但是我们发现一个问题:我们既不能 for (int i = 0;i < y;i++),也不能 while (y--)。这可怎么办呢?还是用 string。我们每循环一次就往一个初始为空的字符串里塞一个字符,这个串有多长我们就循环了多少次。然后,乘法也被淦掉了:

    int X(short x, short y) {
    	std::string str = "";
    	std::string tt = std::string().append(x, ' ');
    	std::string res = "";
    	while (str.append(1, ' ').length() <= y) {
    		res.append(tt);
    	}
    	return res.length();
    }
    

    最后是完整代码:

    #include <iostream>
    #include <string>
    #define ushort unsigned short
    short $(ushort x, ushort y) {
    	return std::string().append(x, '.').append(y, '.').length();
    }
    short _(short x, short y) {
    	y = ~y;
    	return $($(x, reinterpret_cast<ushort&>(y)), 1);
    }
    int X(short x, short y) {
    	std::string str = "";
    	std::string tt = std::string().append(x, ' ');
    	std::string res = "";
    	while (str.append(1, ' ').length() <= y) {
    		res.append(tt);
    	}
    	return res.length();
    }
    int main() {
    	int x, y;
    	std::cin >> x >> y;
    	std::cout << $(x, y) << ' ' << _(x, y) << ' ' << X(x, y) << std::endl;
    }
    

    信息

    ID
    246
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    (无)
    递交数
    249
    已通过
    56
    上传者