函数main()中的语句链表L自动给变量L分配内存,
l对应第二个结构,是LinkList。
调用初始化函数InitList()将值赋给变量l中的成员h:
初始化后,链表长度为0。
插入数据后,链表长度为3。
链表中的数据是: 102030。
//使用代码
首先我们定义一个整数的平方根从非负整数映射到非负整数的函数:我们可以用乘法线性搜索或者二分法搜索得到平方不超过的最大根。通过平方数的数列,我们在线性搜索中只能使用加法,因为两个完全平方数之差是一个奇数列:uint 32 _ t is qrt 0(uint 32 _ t n){ uint 32 _ t delta 3;for(uint 32 _ t square 1;平方n;△2)方三角;返回delta/2-1;}因为问题是关于大整数的,所以我们要把大整数的位数()考虑进去。线性搜索需要多次迭代,每次迭代的加法都需要时间。然而,最坏情况下的二分搜索法需要多次迭代,并且每次乘法都需要时间。但有些数值方法(如牛顿迭代)只适合计算近似,还涉及除法。让 咱们换个思路,参考文章整数平方根。平方根的计算方法类似于长除法。在二进制中,只需要比较和减法。32位无符号整数的C实现如下:uint 32 _ t is qrt 1(uint 32 _ t n){ uint 32 _ t余数0,根0,除数;for(size _ t I 0;i 16i ) {根1;余数2;余数| n 30N2;//从提取2 MSBn除数(根1)1;if(除数余数){余数-除数;根;} }返回root这种方法的迭代次数是次(一个整数有多少位),每次迭代的加、减、移位、比较都是一样的。总时间和时间复杂度低于线性和二分搜索法。由于除数和根的关系是固定的,如果空间是一个考虑因素(考虑大整数或硬件实现),可以把这种形式改为节省除数的存储:uint 32 _ t is qrt 2(uint 32 _ t n){ uint 32 _ t remainder 0,root 0;for(size _ t I 0;i 16i ) {根1;根;余数2;余数| n 30N2;//从n if(根余数){余数-根)中提取2 MSB根;} else-root;}返回根1;}接下来我们用C 11泛形式写这个算法,接受任何无符号整数类型:Template TypeName T T I SQRT(Const T N){ T Remainer { },root { };auto bit count is qrt _ traits t::bitcount(n);for(size _ t I bit count;I 0;){ I-2;根1;根;余数2;余数| isqrt _ traits t::extractwobitsat(n,I);if(根余数){ remainder-root;根;} else-root;}返回根1;} T需要支持、、前缀、前缀-、| uint8_t,还需要提供一个isqrt_traitsT来提取两个额外的操作。对于内置的无符号整数类型,其一般为iSqrt _ traitst如下:Template TypeName T Struct is qrt _ traitst { STatic _ ass::is _ unsign:: value,泛型isqrt只对无符号类型);//两个静态大小的倍数的位数_ T bit count(const T n){ T a(n);size _ t count 0;while(a 0){ a 2;计数2;}返回计数;} //提取i 1,I位静态uint 8 _ T extractwobitsat(const T n,size _ T I){ return static _ castuint 8 _ T((n I)3);} };在isqrt2的每次迭代中,我们通过移位得到两个比特,而在isqrt中,我们使用extractwobitsat(n,I)得到第1个和第1个比特。这个变化是因为可以直接从一个大整数中获取一个比特,而不需要复制另一个大整数进行移位运算。这里的BitCount()其实可以简单的返回siz: : Vector U中,这里U一般可以设置为uint32_t或者uint64_t,并添加十六进制流输出:template typename U class biguint {public: biguint(): v { 0 } { } biguint(std: : initializ: v(init){ } biguint运算符(siz: v){ U outBits x(unitBitCount-shift);x(x shift)| in bits;inBits outBits} if(in bits)v . push _ back(in bits);返回* this} biguint运算符(size _ t shift){ assert(shift unitBitCount);u in bits 0;for(auto itr v . r begin();itr!();itr){ U outBits * itr(unitBitCount-shift);* itr(* itr shift)| in bits;inBits outBits} if(()0)v . pop _ back();返回* this} biguint运算符|(uint 8 _ t RHS){ v[0]| RHS;返回* this} biguint运算符-(const biguint RHS){ ass: 0;u以前的v[I];v[I]-r in borrow;inBorrow v[i]上一页1 : 0;} assert(in borrow 0);while(()1()0)v . pop _ back();返回* this} biguint运算符(){ for(auto x : v)if(x!0)返回* this五. push _ back(1);返回* this} biguint运算符- () { ass: v)if(x-!0)返回* this返回* this} bool运算符(const biguint RHS)const { if(()()){ for(auto I();异- 0;)if (v[i] rhs.v[i])返回tru:e CHO 25-@ . com:e CHO 27-@ . come stream OS,const biguint x){ auto f(OS . flags());OS 0x std:: hex;for(auto itr x . v . r begin();itr!();itr)OS * itr;OS . flags(f);返回OS;} friend struct is qrt _ traitsbiguint;privat:静态常量size _ t unitBitCount siz:: vectoru v;};并为biguintU提供一个iSqrt _ Traits:Template TypeName ustrct iSqrt _ Traitsbiguintu { static size _ t bit count(const biguintU n)。{ r::itbitcount *(()-1)is qrt _ traitsu::bitcount(());} static uint 8 _ t extractwobitsat(const biguintU n,size _ t I){ return static _ castuint 8 _ t((n . v[I/biguintu: unit: unitbitcount](I biguintu: unit: unitbitcount))3);} };我简单测了一下45765和50!开平party:int main(){//floor(SQRT(45765))213 STD : : Cout I SQRT 1(45765)STD : : : : cout isqrt 2(45765)std: : : : cout isqrtunsign: : endl;// 50!49 eebc 961 ed 279 b 02 B1 ef 4f 28d 19 a 84 f 5973 a1d 2c 7800000000000//楼层(sqrt(50!))899310 e 94 A8 b 185249821 ebc: : cout is qrt(biguintuit 32 _ t { 0x 00000000,0xd2c78000,0x4f5973a1,0xf28d19a8,0xb02b1ef4,0x961ed279,0x 49 eebc })std: echo 56--} output $ g-stdc 11-o isqrt isqrt . CPP ./isqrt 213 213 213 0x 899310 e 94 A8 b 185249821 ebce 7050!平方根(sqrt(50!))在十六进制匹配(知乎插入的网址有bug)。原代码在大整数平方根github。注意:还没有完全测试过。-更新1:按@计算提示大海无边,时间复杂度的顺序应该是-更新2: I sqrt 0()之前有错误,感谢@LOOP反馈。
iphone验证密码发生未知错误?iPhon苹果应用商店验证错误?1.注销苹果ID设置-iTuniphone激活为什么会验证失败?苹果 s手机第一次使用或刷机后需要激活。当然,有些用户不可避免地会遇到激活错误。如果他们能 不要激活他们的手机
PS里psd格式怎么保存不了?ps可以 t保存psd格式是:对于jpg格式的图片,如果没有新建图层,只需在背景图层上进行修改,按ctrl S,直接保存为JPG,不会弹出对话框。如果想保存为PSD格式,可以点击文件-另存为PSD。PS中只要有
曾经删除的软件怎么找回?以苹果手机为例。点按屏幕底部的App Store。曾经删除的软件怎么找回?1.打开我们的手机。然后在众多图标中找到带有文字“文件管理”的图标,点击“文件管理”进入页面。2.进入页面后,你会在顶部看到一行字:手机、最
红米9a怎么弄手电筒?R红米手机升级后怎么打开手电筒?粉丝的手机升级后,打开手电筒的还是一样的。具体方法如下:1、打开手机,然后进入phon红米k30手电筒怎么开?从屏幕右上方向下滑动状态栏,找到手电筒图标将其打开。红米note9手电筒快速
联通客服是24小时的吗?人工坐席是48小时的,不过人工上班时间早7点到23点,下班时间后相关的工作人员减少,接入网络人工客服需要的多少时间长毛一些。拨打10010怎么进入人工服务?您好,非常十分感谢您的知道回答。您这个之后,接起来之后您按照
大自然木门怎么样?亲爱的,我用过。我家所有的木门都是水漆的。当时是在《自然》的实体店看到的,被他的抗菌漆膜和50mm的厚度所吸引。老公是设计师,经常加班到很晚,键盘操作会让我休息。50mm的厚度比普通木门厚,隔音效果超级好。大自然木门究竟怎
苹果手机设置耳机怎么取消掉?。方法一:尝试在手机上重新插上耳机,反复插几次,一般耳机模式会自动退出。2.方法2:打开手机的设置,点击 "普通和普通和 "辅助功能和依次进入音频通话模式,并选择 "自动 "。3.方法三:关闭苹果手机,重启。4.
wps转换成pdf格式还会变化么?任何word文档,转化成pdf文档以后,里有文章就肯定不能如何修改了。wps转换成pdf格式文件变大?wps文字转换成pdf格式文件变份大了解决方法:pdf文档是一个非常小的格式文件,当把原文件原图转成pd
羽毛球如何打好后场球?打好后场羽毛球有几个关键点。一是步法到位,让球落在身体前面;第二,必须侧身,弯曲手臂,为动作做准备;第三,手腕的力量要到位,同时腰部和胯部的力量要一起带动。反手是普通羽毛球业余爱好者的弱项。练习反手时,要做到以下几点:
WPS中如何快捷打箭头?准备好了其他工具/基本材料:装上windows的电脑一台,wps办公软件该软件。wps中快捷打箭头的方法如下表:1、首先打开后福昕阅读器该软件,并选择中圆弧形右键菜单中的“插入位置”两个选项。2、然后无法找到型状备选