日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

过于离谱,我实现憋不住了!

發(fā)布時間:2023/12/19 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 过于离谱,我实现憋不住了! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

大家好,我是張巧龍,在知乎,看到了一個問題:

這就是一個求階乘的問題,大家剛剛開始學(xué)編程的時候應(yīng)該都寫過這樣的程序。

一個求階乘的問題,還能玩出什么樣的花兒來?

我在回答區(qū)看到了一個非常有趣的回答,把各種版本的代碼都舉例了出來,一個比一個還離譜,后面的代碼,甚至讓懷疑是我學(xué)過的代碼嗎?

分享給大家圖個樂,下面是回答正文,答主:小白白。

數(shù)學(xué)家版本:

(簡單利索,深藏功與名)

#include?<iostream> #include?<cmath> int?main() {std::cout?<<?std::tgamma(20?+?1)?<<?std::endl; }

語言學(xué)家版本:

(語言學(xué)家,你懂得,恨不得把所有語法特性都派上用場)

#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; }

歷史學(xué)家版本:

(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);? }

敏捷開發(fā)上線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); }

面向?qū)ο髮<野姹?#xff1a;

(好家伙,一個簡單的問題,愣是祭出了接口、繼承、虛函數(shù)、虛繼承、智能指針等一大堆東西出來,這很面向?qū)ο?#xff09;

#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(); }

提前優(yōu)化的并行版本:

(一看就是精通底層技術(shù)的大佬,把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; }

“宏孩兒”元編程版:

(當(dāng)年看各種C++框架中,排山倒海一樣的宏定義,簡直令人發(fā)指)

#include?<boost/preprocessor.hpp>//?由于boost.preprocessor僅提供255以下的整數(shù)運(yùn)算 //?所以使用sequence來?(十位個位)(千位百位)(十萬位萬位)?的方式來表示大整數(shù)。//?不進(jìn)位加法:(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)//?進(jìn)位加法:(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的取值范圍//?大整數(shù)的表示 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...>>?{};//?返回較大的數(shù)值 template<int?A,?int?B>?struct?int_min?:?std::integral_constant<int,?(A<B?B:A)>?{};//?非進(jìn)位加法:先把兩個數(shù)的位數(shù)改成一樣的然后依次相加 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)?&&?...)>?{};//?自動進(jìn)位 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并自動進(jìn)位 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)...>>?{};//?計(jì)算階乘 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++ 玩出這么多花樣,不愧是語言學(xué)家。當(dāng)然,現(xiàn)實(shí)工作中不會有人這樣寫代碼的,所以大家圖個樂就好,不用較真。

你們在第幾個版本倒下了?

我反正看到面向?qū)ο髮<野姹揪鸵呀?jīng)忍不住了

搞硬件,別吹牛了,好好做個規(guī)劃!

如果再寫for循環(huán),我就錘自己!

別小看不起眼的電阻,里面大有學(xué)問!

這是通信協(xié)議最"赤裸"的時刻!

總結(jié)

以上是生活随笔為你收集整理的过于离谱,我实现憋不住了!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。