C 使用string的大數快速模冪運算(6)

2022-10-03 23:42:16 字數 2579 閱讀 9181

專案要點

1.大數指的是遠超long long int的資料

2.將大數用矩陣進行儲存,並通過矩陣實現運算

3.本人採用字串進行儲存,應注意char的特點

比如:char a=161;

cout<

此時會輸出-95,而不是161,char型別首個位元位是作為正負號的

模冪快速演算法

a,m為正整數,將m表示為二進位制形式則可得

舉個例子

**中有之前的減法 乘法 取模 除法運算 

可得以下快速指數演算法以及執行截圖

#include

#include

#include

#include

using namespace std;

#define n 10

string dezero(string a)//用來去掉正數前面的0,也就是說可以輸入000001類似這樣的數字

if(i==a.length()) return "0";

a.erase(0,i);

return a;

}int judge(string a,string b)//判斷兩個正數的大小

if(judge(a,b)==-1)

reverse(c1.begin(),c1.end());

reverse(c2.begin(),c2.end());

for(i=0;i=48&&c2.at(i)<=57) c2.at(i)-=48;

if(c2.at(i)>=97&&c2.at(i)<=122) c2.at(i)-=87;

} for(i=0;i=48&&c1.at(i)<=57) c1.at(i)-=48;

if(c1.at(i)>=97&&c1.at(i)<=122) c1.at(i)-=87;

} for(i=0;i=0;i--)

c1.erase(i+1,c1.length());

for(i=0;i=10) c1.at(i)+=87;

if(c1.at(i)<10) c1.at(i)+=48;

} reverse(c1.begin(),c1.end());

if(j==-1) c1.insert(0,d);

return c1;

}string multiply(string a,string b)//整數

if(b.at(0)=='-')

a=dezero(a);

b=dezero(b);

if(a.at(0)==48||b.at(0)==48) return "0";

if(a.length()>b.length())

else

reverse(c1.begin(),c1.end());

reverse(c2.begin(),c2.end());

for(i=0;i=48&&c2.at(i)<=57) c2.at(i)-=48;

if(c2.at(i)>=97&&c2.at(i)<=122) c2.at(i)-=87;

} for(i=0;i=48&&c1.at(i)<=57) c1.at(i)-=48

if(c1.at(i)>=97&&c1.at(i)<=122) c1.at(i)-=87;

} for(i=0;i=n)

else

}} }

for(i=c3.length()-1;i>=0;i--)

c3.erase(i+1,c3.length());

for(i=0;i=10) c3.at(i)+=87;

if(c3.at(i)<10) c3.at(i)+=48;

} reverse(c3.begin(),c3.end());

if(yao==1) c3="-"+c3;

return c3;

}string mod(string a,string b)

c1=dezero(a);

c2=dezero(b);

d="";

for(i=0;i=0) }

if(j==1) d=minus(b,d);

return dezero(d);

}string divide(string a,string b)//正整數除法

c1=dezero(a);

c2=dezero(b);

d="";

e="";

for(i=0;i=0)

e=e+"0";

e.at(i)=j;

} for(i=0;i=10) e.at(i)+=87;

if(e.at(i)<10) e.at(i)+=48;

} e=dezero(e);

return e;

}string quickpower(string a,string b,string c)//快速指數演算法a的b程式設計客棧次方mod c

reverse(e.begin(),e.end());

//快速指數演算法

b=e;

stri d="1";

for(i=0;i>a>>b>>c)

{ cout<

本文標題: c++使用string的大數快速模冪運算(6)

本文位址:

快速冪 大數取模

首先要知道取餘的公式 a b p a p b p p。那麼冪不就是乘機的累積嗎,由此給出 int fast int a,int b,int p return int t p 順便把大數取模也給出吧,它的原理就是這個取餘公式 a b p a p b p p 那麼大數可以看做每一位的那位數字乘以自身的權...

快速冪 大數乘法取模

求冪的優化 快速冪 大數相乘取模 快速大數冪 快速冪 在的標頭檔案中自帶的pow 函式在呼叫時需要一系列型別轉換,所以數值並不是很嚴格精確,存在誤差,執行效率低,最好不要用,最好自己編寫。ll mypow ll x,ll n,ll mod return res 大數乘法取模 在計算 x x mod ...

C 快速冪與大數取模演算法示例

一 快速冪 其實就是求 a b p,其中a,b,p都比較大在int範圍內 這類問www.cppcns.com題。首先要知道取餘的公式 a b p a p b p p。那麼冪不就是乘機的累積嗎,由此給出 int fast int a,int b,int p return int t p 二 大數取模 ...