本文个人原创整理。转载请注明出处,谢谢。
我们知道在C/C++中int型可处理-2^31~2^31-1(32位及以上编译器),long long型可处理-2^63~2^63-1的数据,这实际上是非常有限的。在非常多情况下。我们往往会处理范围更大的数据。
Java中有BigInteger类,python中想要多大就有多大(取决于内存),可是C/C++就显得有些乏力,这时候我们会手写大数类。用一个数组记录一个数,来模拟竖式计算。
通常我们会一位一位地储存数据,这样易于实现,逻辑清晰,方便理解,可是一定程度上牺牲了效率,浪费了资源,那么是否能多位存储数据并操作呢。显然是能够的。
我们知道int类型能表示的最大数量级为10^9左右,为了避免乘法溢出,我们最好还是用一个int存储4位数字(10^4),能够轻易写下例如以下代码(仅含加、减、乘和比較操作):
/* * * Author : fcbruce * * Time : Fri 24 Oct 2014 02:43:41 PM CST * */#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include
当中void str(char *)函数为将该大数转换成字符串。
随机生成100000组10^82数量级下面的数据并进行对拍,没有发现错误。
long long能表示的数据范围更大,能压很多其它的位数。会不会更快呢?最好还是一次压8位。对以上代码稍加修改就可以
/* * * Author : fcbruce * * Time : Fri 24 Oct 2014 02:43:41 PM CST * */#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include
改动对拍代码。发现使用压8位的long long 版大数从性能上确实要优于压4位的int版大数,尽管int版偶尔会稍快于long long版,但平均性能上long long版要比int版快20%~60%(包含IO)
数据生成代码:
### Author : fcbruce ## Time : Fri 24 Oct 2014 06:33:17 PM CST##import randomT_T=100000print T_Tfor i in xrange(T_T): a=random.randint(0,1237648236422345678987655432349875934875632123131523784682932317237132418743972317); b=random.randint(0,12345678987623463824593658235543232123131238746239523172371376382423749824172324317); print a+b,a
标程代码:
### Author : fcbruce ## Time : Fri 24 Oct 2014 06:38:52 PM CST##n=input()for i in xrange(n): a,b=map(int,raw_input().split()) print a+b,a-b,a*b
对拍代码:
#!/bin/bash## Author : fcbruce ## Time : Fri 24 Oct 2014 07:01:27 PM CST##while true; do python data.py > input python std.py < input > std_output begin_time_int=$(date "+%s%N") ./bign_int < input >bign_int_output end_time_int=$(date "+%s%N") begin_time_longlong=$(date "+%s%N") ./bign_longlong < input >bign_longlong_output end_time_longlong=$(date "+%s%N") use_time_int=$(expr $end_time_int - $begin_time_int) use_time_longlong=$(expr $end_time_longlong - $begin_time_longlong) echo "bign int" diff std_output bign_int_output if [ $? -ne 0 ]; then echo "Wrong Answer" break; else echo "Accepted" echo "run time : " $use_time_int fi echo echo "bign long long" diff std_output bign_longlong_output if [ $? -ne 0 ]; then echo "Wrong Answer" break; else echo "Accepted" echo "run time : " $use_time_longlong fi echo test $use_time_longlong -lt $use_time_int if [ $? -ne 0 ] ; then echo "int faster" else echo "long long faster" fi echo echodone
部分測试结果(执行时间单位:十亿分之中的一个秒,測试环境:ubuntu10.04 ,编译开O2优化。gnu++0x。主频:2.26GHz × 2 ):
![](https://img-blog.csdn.net/20141024204756569?)
参考资料:
《算法入门经典大赛》—— 刘如家