大数演算
大数运算
求关于大数的次方运算,要求在秒级能够完成
------解决方案--------------------
幂运算的快算法O(long(N))次乘法。
据说乘法也有快速算法。
即便乘法不用快速算法,秒级也是没问题的。
输出到屏幕,是个效率极低的方法。
直接输出到文件吧。
------解决方案--------------------
大数运算用GMP库,参考http://blog.****.net/turingo/article/details/8249799
------解决方案--------------------
抛砖引玉:
求关于大数的次方运算,要求在秒级能够完成
算法
------解决方案--------------------
幂运算的快算法O(long(N))次乘法。
据说乘法也有快速算法。
即便乘法不用快速算法,秒级也是没问题的。
输出到屏幕,是个效率极低的方法。
直接输出到文件吧。
------解决方案--------------------
大数运算用GMP库,参考http://blog.****.net/turingo/article/details/8249799
------解决方案--------------------
抛砖引玉:
#include <iostream>
#include <string>
using namespace std;
inline int compare(string str1,string str2) {//相等返回0,大于返回1,小于返回-1
if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数
else if (str1.size()<str2.size()) return -1;
else return str1.compare(str2); //若长度相等,则头到尾按位比较
}
string SUB_INT(string str1,string str2);
string ADD_INT(string str1,string str2) {//高精度加法
int sign=1; //sign 为符号位
string str;
if (str1[0]=='-') {
if (str2[0]=='-') {
sign=-1;
str=ADD_INT(str1.erase(0,1),str2.erase(0,1));
} else {
str=SUB_INT(str2,str1.erase(0,1));
}
} else {
if (str2[0]=='-') {
str=SUB_INT(str1,str2.erase(0,1));
} else { //把两个整数对齐,短整数前面加0补齐
string::size_type L1,L2;
int i;
L1=str1.size();
L2=str2.size();
if (L1<L2) {
for (i=1;i<=L2-L1;i++) str1="0"+str1;
} else {
for (i=1;i<=L1-L2;i++) str2="0"+str2;
}
int int1=0,int2=0; //int2 记录进位
for (i=str1.size()-1;i>=0;i--) {
int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;
int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;
str=char(int1+'0')+str;
}
if (int2!=0) str=char(int2+'0')+str;
}
}
//运算后处理符号位
if ((sign==-1)&&(str[0]!='0')) str="-"+str;
return str;
}
string SUB_INT(string str1,string str2) {//高精度减法
int sign=1; //sign 为符号位
string str;
int i,j;
if (str2[0]=='-') {
str=ADD_INT(str1,str2.erase(0,1));
} else {
int res=compare(str1,str2);
if (res==0) return "0";
if (res<0) {
sign=-1;
string temp =str1;
str1=str2;
str2=temp;
}
string::size_type tempint;