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
,异或相当于是不进位加法,使 a
和 b
二进制表示下恰好一个是1的为为1,其他位为0。
然后进位部分就是 a
和 b
二进制表示下均为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 说的对