过于离谱,我实现憋不住了!
大家好,我是張巧龍,在知乎,看到了一個問題:
這就是一個求階乘的問題,大家剛剛開始學編程的時候應該都寫過這樣的程序。
一個求階乘的問題,還能玩出什么樣的花兒來?
我在回答區看到了一個非常有趣的回答,把各種版本的代碼都舉例了出來,一個比一個還離譜,后面的代碼,甚至讓懷疑是我學過的代碼嗎?
分享給大家圖個樂,下面是回答正文,答主:小白白。
數學家版本:
(簡單利索,深藏功與名)
#include?<iostream> #include?<cmath> int?main() {std::cout?<<?std::tgamma(20?+?1)?<<?std::endl; }語言學家版本:
(語言學家,你懂得,恨不得把所有語法特性都派上用場)
#include?<iostream> #include?<utility>template<std::size_t...I>?constexpr?auto?foo(std::index_sequence<I...>)?{?return?((I+1)?*?...);?}int?main()? {std::cout?<<?foo(std::make_index_sequence<20>())?<<?std::endl; }歷史學家版本:
(void main() 有沒有嗅到濃厚的歷史氣息?)
#include?<stdio.h> void?main(void)?{int?i;long?long?j;for(i?=?1,?j?=?1;i?<=?20;?j?*=?i++);printf("%lld",?j);? }敏捷開發上線1.0版本:
(可以說是非常敏捷了)
#include?<stdio.h> int?main()?{//printf("%d",?1*2*3*4*5*6*7*8*9*10);printf("%lld",?(long?long)1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20); }面向對象專家版本:
(好家伙,一個簡單的問題,愣是祭出了接口、繼承、虛函數、虛繼承、智能指針等一大堆東西出來,這很面向對象)
#include?<iostream> #include?<string> #include?<memory>struct?IBaseInterface?{virtual?~IBaseInterface()?=?0; }; inline?IBaseInterface::~IBaseInterface()?=?default;struct?IDataProvider?:?virtual?public?IBaseInterface?{virtual?int?first()?=?0;virtual?int?last()?=?0;virtual?int?next(int?v)?=?0; };struct?ICalculator?:?virtual?public?IBaseInterface?{virtual?long?long?calc(IDataProvider?*)?=?0; };struct?IPrinter?:?virtual?public?IBaseInterface?{virtual?void?print(const?std::string?&)?=?0; };struct?ISerializer?:?virtual?public?IBaseInterface?{virtual?std::string?serialize(long?long?value)?=?0; };struct?IRunnable?:?virtual?public?IBaseInterface?{virtual?void?run()?=?0; };class?Foo?:?virtual?public?IRunnable?{std::shared_ptr<IDataProvider>?m_dp;std::shared_ptr<ICalculator>?m_c;std::shared_ptr<ISerializer>?m_s;std::shared_ptr<IPrinter>?m_p; public:Foo(std::shared_ptr<IDataProvider>?dp,?std::shared_ptr<ICalculator>?c,?std::shared_ptr<ISerializer>?s,?std::shared_ptr<IPrinter>?p)?:?m_dp(std::move(dp)),?m_c(std::move(c)),?m_s(std::move(s)),m_p(std::move(p))?{}void?run()?override?{?return??m_p->print(m_s->serialize(m_c->calc(m_dp.get())));?} };class?DefaultSerializer?:?virtual?public?ISerializer?{ public:std::string?serialize(long?long?value)?override?{?return?std::to_string(value);?} };class?StreamPrinter?:?virtual?public?IPrinter?{std::ostream?&m_os; public:explicit?StreamPrinter?(std::ostream?&os)?:?m_os(os)?{}void?print(const?std::string?&s)??override?{?m_os?<<?s?<<?std::endl;?} };class?MultiplyAccumulateCalculator?:?virtual?public?ICalculator?{ public:long?long?calc(IDataProvider?*dp)?override?{int?i?=?dp->first();long?long?j?=?i;doj?*=?(i?=?dp->next(i));while(i?!=?dp->last());return?j;} };int?main()?{struct?MyDataProvider?:?virtual?public?IDataProvider?{int?first()?override?{?return?1;?}int?last()?override?{?return?20;?}int?next(int?v)?override?{?return?v+1;?}};Foo?foo(std::make_shared<MyDataProvider>(),?std::make_shared<MultiplyAccumulateCalculator>(),?std::make_shared<DefaultSerializer>(),?std::make_shared<StreamPrinter>(std::cout));foo.run(); }提前優化的并行版本:
(一看就是精通底層技術的大佬,把CPU拿捏得死死的)
#include?<iostream> #include?<xmmintrin.h>double?foo(int?x)?{__m128?a?=?{1.0f,?2.0f,?3.0f,?4.0f};__m128?b?=?{4.0f,?4.0f,?4.0f,?4.0f};__m128?c?=?{1.0f,?1.0f,?1.0f,?1.0f};for(int?i?=?0;?i?<?x?/?4;?++i,?a?=?_mm_add_ps(a,?b))c?=?_mm_mul_ps(c,?a);for(int?i?=?x?%?4;?i?<?4;?++i)a[i]?=?1.0f;c?=?_mm_mul_ps(c,?a);return?(double)c[0]?*?(double)c[1]?*?(double)c[2]?*?(double)c[3]; }int?main()?{std::cout?<<?foo(20)?<<?std::endl; }黑魔法版本:
(能看懂這段代碼的,都不是普通人!)
#include?<iostream> #include?<numeric> #include?<vector> #include?<functional> int?main()?{std::vector<int>?v(std::atoi(std::end(__DATE__)?-?(__LINE__)?/?2)?-?1);?//?2021年,第六行std::iota(v.begin(),?v.end(),?1);std::cout?<<?std::accumulate(v.begin(),?v.end(),?1ull,?std::multiplies<>())?<<?std::endl; }“宏孩兒”元編程版:
(當年看各種C++框架中,排山倒海一樣的宏定義,簡直令人發指)
#include?<boost/preprocessor.hpp>//?由于boost.preprocessor僅提供255以下的整數運算 //?所以使用sequence來?(十位個位)(千位百位)(十萬位萬位)?的方式來表示大整數。//?不進位加法:(77)(66)(55)?+?(44)(33)(22)?=?(121)(99)(77) #define?PP_ADD_N_N_CARRY_OP(R,?DATA,?I,?ELEM)?(BOOST_PP_ADD(BOOST_PP_SEQ_ELEM(I,?DATA),?ELEM)) #define?PP_ADD_N_N_CARRY(SEQ_A,?SEQ_B)?BOOST_PP_SEQ_FOR_EACH_I(PP_ADD_N_N_CARRY_OP,?SEQ_A,?SEQ_B)//?進位加法:(121)(99)(77)?=?(21)(0)(78) //?注意SEQ_A的長度要比SEQ_B長 #define?PP_ADD_N_N_OP(S,?STATE,?ELEM_CARRY)?\BOOST_PP_SEQ_PUSH_FRONT(?\BOOST_PP_SEQ_REPLACE(STATE,?0,?BOOST_PP_MOD(BOOST_PP_ADD(BOOST_PP_SEQ_HEAD(STATE),?ELEM_CARRY),?100)),?\BOOST_PP_DIV(BOOST_PP_ADD(BOOST_PP_SEQ_HEAD(STATE),?ELEM_CARRY),?100)?\) #define?PP_ADD_N_N(SEQ_A,?SEQ_B)?BOOST_PP_SEQ_REVERSE(BOOST_PP_SEQ_FOLD_LEFT(PP_ADD_N_N_OP,?BOOST_PP_SEQ_NIL(0),?PP_ADD_N_N_CARRY(SEQ_A,?SEQ_B)))//?沒什么好說的,X*N?=?X+X+X+X+X+...+X #define?PP_MUL_N_1_EXP_OP(Z,?I,?DATA)?(DATA) #define?PP_MUL_N_1_EXP(SEQ_N,?N)?BOOST_PP_REPEAT(N,?PP_MUL_N_1_EXP_OP,?SEQ_N) #define?PP_MUL_N_1_MYOP(S,?STATE,?ITEM)?PP_ADD_N_N(STATE,?ITEM) #define?PP_MUL_N_1_FWD(EXP)?BOOST_PP_SEQ_FOLD_LEFT(PP_MUL_N_1_MYOP,?BOOST_PP_SEQ_HEAD(EXP),?BOOST_PP_SEQ_TAIL(EXP)) #define?PP_MUL_N_1(SEQ_N,?N)?PP_MUL_N_1_FWD(PP_MUL_N_1_EXP(SEQ_N,?N))#define?FACT5?PP_MUL_N_1(PP_MUL_N_1(PP_MUL_N_1(PP_MUL_N_1((1),?2),?3),?4),?5) #define?FACT10?PP_MUL_N_1(PP_MUL_N_1(PP_MUL_N_1(PP_MUL_N_1(PP_MUL_N_1(FACT5,?6),?7),?8),?9),?10) #define?FACT15?PP_MUL_N_1(PP_MUL_N_1(PP_MUL_N_1(PP_MUL_N_1(PP_MUL_N_1(FACT10,?11),?12),?13),?14),?15) #define?FACT20?PP_MUL_N_1(PP_MUL_N_1(PP_MUL_N_1(PP_MUL_N_1(PP_MUL_N_1(FACT15,?16),?17),?18),?19),?20) #define?FACT25?PP_MUL_N_1(PP_MUL_N_1(PP_MUL_N_1(PP_MUL_N_1(PP_MUL_N_1(FACT20,?21),?22),?23),?24),?25)static_assert(false,?BOOST_PP_STRINGIZE(FACT10));真·模板元編程版本
(泛型編程,碼不驚人死不休)
#include?<iostream> #include?<iomanip> #include?<type_traits>using?BaseType_t?=?long?long; constexpr?BaseType_t?lgBase?=?9;?//?注意10000*10000剛剛好小于int的取值范圍 constexpr?BaseType_t?Base?=?1000000000;?//?注意10000*10000剛剛好小于int的取值范圍//?大整數的表示 template<BaseType_t...I>?struct?BigInteger?{using?type?=?BigInteger; };//?連接 template<class?T1,?class?T2>?struct?BI_Cat; template<BaseType_t...I1,?BaseType_t...I2>?struct?BI_Cat?<BigInteger<I1...>,?BigInteger<I2...>>?:?BigInteger<I1...,?I2...>?{};//?左移一個單元(即*Base) template<class?T>?struct?BI_SHL; template<BaseType_t...I>?struct?BI_SHL<BigInteger<I...>>?:?BigInteger<I...,?0>?{};//?去除開頭的0 template<class?T>?struct?BI_Remove_Zeros?:?T?{}; template<BaseType_t...I>?struct?BI_Remove_Zeros<BigInteger<0,?I...>>?:?BI_Remove_Zeros<BigInteger<I...>>?{};//?填充0到N個單元 template<int?X,?class?IS>?struct?BI_Fill_Impl; template<int?X,?class?T,?T...I>?struct?BI_Fill_Impl<X,?std::integer_sequence<T,?I...>>?:?BigInteger<(I,?X)...>?{}; template<int?Size>?struct?BI_Fill_Zeros?:?BI_Fill_Impl<0,?std::make_index_sequence<Size>>?{};template<class?T,?int?N>?struct?BI_Resize; template<BaseType_t...I,?int?N>?struct?BI_Resize<BigInteger<I...>,?N>?:?BI_Cat<typename?BI_Fill_Zeros<N?-?sizeof...(I)>::type,?BigInteger<I...>>?{};//?返回較大的數值 template<int?A,?int?B>?struct?int_min?:?std::integral_constant<int,?(A<B?B:A)>?{};//?非進位加法:先把兩個數的位數改成一樣的然后依次相加 template<class?A,?class?B,?class?ShouldResize>?struct?BI_AddNotCarry_Impl; template<BaseType_t...I1,?BaseType_t...I2>?struct?BI_AddNotCarry_Impl?<BigInteger<I1...>,?BigInteger<I2...>,?std::true_type>?:?BigInteger<(I1?+?I2)...>?{};template<BaseType_t...I1,?BaseType_t...I2>?struct?BI_AddNotCarry_Impl?<BigInteger<I1...>,?BigInteger<I2...>,?std::false_type>:?BI_AddNotCarry_Impl<typename?BI_Resize<BigInteger<I1...>,?int_min<sizeof...(I1),?sizeof...(I2)>::value>::type,typename?BI_Resize<BigInteger<I2...>,?int_min<sizeof...(I1),?sizeof...(I2)>::value>::type,std::true_type>{};template<class?A,?class?B>?struct?BI_AddNotCarry; template<BaseType_t...I1,?BaseType_t...I2>?struct?BI_AddNotCarry?<BigInteger<I1...>,?BigInteger<I2...>>:?BI_AddNotCarry_Impl<BigInteger<I1...>,?BigInteger<I2...>,?std::bool_constant<sizeof...(I1)?==?sizeof...(I2)>>?{};//?判斷是否為0 template<class?Y>?struct?BI_IsZero; template<BaseType_t...I>?struct?BI_IsZero<BigInteger<I...>>?:?std::bool_constant<((I?==?0)?&&?...)>?{};//?自動進位 template<class?A>?struct?BI_Carry; template<class?A,?class?B>?struct?BI_Add?:?BI_Carry<typename?BI_AddNotCarry<A,?B>::type>?{};template<class?Mod,?class?Div,?class?ShouldCalc?=?typename?BI_IsZero<Div>::type>?struct?BI_Carry_Impl; template<class?Mod,?class?Div>?struct?BI_Carry_Impl<Mod,?Div,?std::true_type>?:?Mod?{}; template<class?Mod,?class?Div>?struct?BI_Carry_Impl<Mod,?Div,?std::false_type>:?BI_Add<Mod,?typename?BI_SHL<Div>::type?>?{}; template<BaseType_t...I>?struct?BI_Carry<BigInteger<I...>>:?BI_Remove_Zeros<typename?BI_Carry_Impl<BigInteger<(I?%?Base)...>,?BigInteger<(I?/?Base)...>>::type>?{};//?乘以X并自動進位 template<class?A,?int?X>?struct?BI_MulX; template<BaseType_t...I1,?int?X>?struct?BI_MulX?<BigInteger<I1...>,?X>:?BI_Carry<BigInteger<(I1?*?X)...>>?{};//?計算階乘 template<int?X>?struct?BI_Fact?:?BI_MulX<typename?BI_Fact<X-1>::type,?X>?{}; template<>?struct?BI_Fact<0>?:?BigInteger<1>?{};template<BaseType_t...I> std::ostream?&operator<<(std::ostream?&out,?BigInteger<I...>)?{return?((out?<<?std::setfill('0')?<<?I?<<?std::setw(lgBase)),?...); }int?main() {std::cout?<<?typename?BI_Fact<20>::type()?<<?std::endl; }原回答:
https://www.zhihu.com/question/365763395/answer/971009059
不得不服,這位老哥真是人才,把 C++ 玩出這么多花樣,不愧是語言學家。當然,現實工作中不會有人這樣寫代碼的,所以大家圖個樂就好,不用較真。
你們在第幾個版本倒下了?
我反正看到面向對象專家版本就已經忍不住了
搞硬件,別吹牛了,好好做個規劃!
如果再寫for循環,我就錘自己!
別小看不起眼的電阻,里面大有學問!
這是通信協議最"赤裸"的時刻!
總結
以上是生活随笔為你收集整理的过于离谱,我实现憋不住了!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不能点击的短信!央视 3・15 晚会曝光
- 下一篇: 嵌入式大牛常用的十大C/C++开发利器