为什么这个代码能过?!求语法解析

P1001 A+B Problem

66xyyd @ 2023-08-21 17:56:19

#include<iostream>
using namespace std;
using ____=decltype(1);
using __________=std::ostream;
using ___________=std::istream;
template<typename T>
concept ________=requires(T a){
    cout << a;
};
template<typename T>
concept _______=requires(T a){
    cin >> a;
};
template<typename T>
concept _________=is_integral_v<T>||requires(T a,T b){
    (a^b|a&b|(a&b)<<1);
};
template<_________ T>
const T _(const T &a,const T &b){
//  cout << "a=" << a << ", b=" << b << ".\n";
    if(b==0){
        return a;
    } else{
        return _((a^b),((a&b)<<1));
    }
}
__________ &_____(__________ &os){
    return os;
}
template<________ T>
__________ &_____(__________ &os,const T &val){
    return (os << val);
}
template<________ T,________... Args>
__________ &_____(__________ &os,const T &val,const Args& ...args){
    return ______(______(os,val),args...);
}
___________ &______(___________ &is){
    return is;
}
template<_______ T>
___________ &______(___________ &is,T &val){
    return (is >> val);
}
template<_______ T,_______... Args>
___________ &______(___________ &is,T &val,Args& ...args){
    return ______((______(is,val),is),args...);
}
int main(){
    ____ __,___;
    ______(cin,__,___);
    _____(cout,_(__,___));
    return 0;
}

提交选择C++20即可通过,但里面用到了什么东西??没看懂


by zhouzihang1 @ 2023-08-21 17:57:59

虽然我不知道,但他应该知道


by fangzichang @ 2023-08-21 18:09:01

输入输出肯定看得出来。
去掉输入输出有意义的就一个函数。

template<_________ T>
const T _(const T &a,const T &b){
//  cout << "a=" << a << ", b=" << b << ".\n";
    if(b==0){
        return a;
    } else{
        return _((a^b),((a&b)<<1));
    }
}

然后这显然是对的。手玩一下就知道了,懒得写了。
和c++20并无很重要的联系。


by 66xyyd @ 2023-08-21 18:11:43

@fangzichang 谢谢


by fangzichang @ 2023-08-21 18:12:10

还是写一下吧。我假设你知道基础位运算语法。
a^b,异或相当于是不进位加法,使 ab 二进制表示下恰好一个是1的为为1,其他位为0。
然后进位部分就是 ab 二进制表示下均为1的位,即 a&b,要进位就变成了 ((a&b)<<1)
然后对新的两个数字重复类似操作,直到没有进位(b==0)。


by 66xyyd @ 2023-08-21 18:19:46

原来如此(恍然大悟)


by huyucheng2012 @ 2023-08-24 19:49:35

@zhouzihang1 说的对


|