最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++使用string的大數(shù)快速模冪運(yùn)算(6)

 更新時(shí)間:2019年09月18日 14:42:34   作者:好想告訴你wt  
這篇文章主要為大家詳細(xì)介紹了C++使用string的大數(shù)快速模冪運(yùn)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本次項(xiàng)目目標(biāo):使用C++完成對(duì)于大數(shù)的相關(guān)運(yùn)算,具體有加減乘除取模。

項(xiàng)目要點(diǎn)

1.大數(shù)指的是遠(yuǎn)超long long int的數(shù)據(jù)

2.將大數(shù)用矩陣進(jìn)行存儲(chǔ),并通過矩陣實(shí)現(xiàn)運(yùn)算

3.本人采用字符串進(jìn)行存儲(chǔ),應(yīng)注意char的特點(diǎn)

比如:char a=161;

     cout<<(int)a;

此時(shí)會(huì)輸出-95,而不是161,char類型首個(gè)比特位是作為正負(fù)號(hào)的

模冪快速算法

a,m為正整數(shù),將m表示為二進(jìn)制形式

可得

舉個(gè)例子

代碼中有之前的減法 乘法 取模 除法運(yùn)算 

可得以下快速指數(shù)算法以及運(yùn)行截圖

#include<iostream>
#include<string>
#include<algorithm>
#include<time.h>
using namespace std;
#define n 10
string dezero(string a)//用來去掉正數(shù)前面的0,也就是說可以輸入000001類似這樣的數(shù)字
{
 long int i;
 for(i=0;i<a.length();i++)
 {
 if(a.at(i)>48) break;
 }
 if(i==a.length()) return "0";
 a.erase(0,i);
 return a;
}
int judge(string a,string b)//判斷兩個(gè)正數(shù)的大小
{
 if(a.length()>b.length()) return 1;
 if(a.length()<b.length()) return -1;
 long int i;
 for(i=0;i<a.length();i++)
 {
 if(a.at(i)>b.at(i)) return 1;
 if(a.at(i)<b.at(i)) return -1;
 }
 return 0;
}
string minus(string a,string b)//自然數(shù)減法
{
 a=dezero(a);
 b=dezero(b);
 long int i,j=0;
 string c="0";
 string c1,c2;
 string d="-";
 if(judge(a,b)==0) return c;
 if(judge(a,b)==1)
 {
 c1=a;
 c2=b;
 }
 if(judge(a,b)==-1)
 {
 c1=b;
 c2=a;
 j=-1;
 }
 reverse(c1.begin(),c1.end());
 reverse(c2.begin(),c2.end());
 for(i=0;i<c2.length();i++)
 {
 if(c2.at(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<c1.length();i++)
 {
 if(c1.at(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<c2.length();i++)
 {
 c1.at(i)=c1.at(i)-c2.at(i);
 }
 for(i=0;i<c1.length()-1;i++)
 {
 if(c1.at(i)<0)
 {
  c1.at(i)+=n;
  c1.at(i+1)--;
 }
 }
 for(i=c1.length()-1;i>=0;i--)
 {
 if(c1.at(i)>0) break;
 }
 c1.erase(i+1,c1.length());
 for(i=0;i<c1.length();i++)
 {
 if(c1.at(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)//整數(shù)
{
 long int i,j,k,yao=0,kai;
 string c1,c2;
 string c3=a+b;
 if(a.at(0)=='-')
 {
 a.erase(0,1);
 yao++;
 }
 if(b.at(0)=='-')
 {
 b.erase(0,1);
 yao++;
 }
 a=dezero(a);
 b=dezero(b);
 if(a.at(0)==48||b.at(0)==48) return "0";
 if(a.length()>b.length())
 {
 c1=a;
 c2=b;
 }
 else
 {
 c1=b;
 c2=a;
 }
 reverse(c1.begin(),c1.end());
 reverse(c2.begin(),c2.end());
 for(i=0;i<c2.length();i++)
 {
 if(c2.at(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<c1.length();i++)
 {
 if(c1.at(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<c3.length();i++) c3.at(i)=0;
 for(i=0;i<c2.length();i++)
 {
 for(j=0;j<c1.length();j++)
 {
  kai=c2.at(i)*c1.at(j);
  c3.at(i+j+1)+=kai/n;
  c3.at(i+j)+=kai%n;
  for(k=i+j;k<c3.length()-1;k++)
  {
  if(c3.at(k)>=n) 
  {
   c3.at(k+1)+=c3.at(k)/n;
   c3.at(k)=c3.at(k)%n;
  }
  else
  {
   break;
  }
  }
 }
 }
 for(i=c3.length()-1;i>=0;i--)
 {
 if(c3.at(i)>0) break;
 }
 c3.erase(i+1,c3.length());
 for(i=0;i<c3.length();i++)
 {
 if(c3.at(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)
{
 long int i,j=0;
 string c1,c2,c3,d;
 if(a.at(0)=='-') j=1;
 if(judge(a,b)==0) return "0";
 if(judge(a,b)==-1)
 {
 return dezero(a);
 }
 c1=dezero(a);
 c2=dezero(b);
 d="";
 for(i=0;i<c1.length();i++)
 {
 d=d+c1.at(i);
 while(judge(d,b)>=0)
 {
  d=minus(d,b);
  d=dezero(d);
 }
 }
 if(j==1) d=minus(b,d);
 return dezero(d);
}
string divide(string a,string b)//正整數(shù)除法
{
 if(b.length()==1&&b.at(0)==48) return "error";
 long int i,j;
 string c1,c2,d,e;
 if(judge(a,b)==0) return "1";
 if(judge(a,b)==-1)
 {
 return "0";
 }
 c1=dezero(a);
 c2=dezero(b);
 d="";
 e="";
 for(i=0;i<c1.length();i++)
 {
 j=0;
 d=d+c1.at(i);
 d=dezero(d);
 while(judge(d,b)>=0)
 {
  d=minus(d,b);
  d=dezero(d);
  j++;
 }
 e=e+"0";
 e.at(i)=j;
 }
 for(i=0;i<e.length();i++)
 {
 if(e.at(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)//快速指數(shù)算法a的b次方mod c
{
 //進(jìn)制轉(zhuǎn)換
 string e;
 long int i;
 i=0;
 while(1)
 {
 if(b.length()==1&&b.at(0)==48) break;
 e=e+"0";
 e.at(i)=mod(b,"2").at(0);
 b=divide(b,"2");
 i++;
 }
 reverse(e.begin(),e.end());
 //快速指數(shù)算法
 b=e;
 string d="1";
 for(i=0;i<b.length();i++)
 {
 if(b.at(i)==49) d=multiply(d,a);
 if(i!=b.length()-1) d=multiply(d,d);
 d=mod(d,c);
 }
 return d;
}
int main()
{
 string a,b,c;
 while(cin>>a>>b>>c)
 {
 cout<<quickpower(a,b,c)<<endl;
 }
 return 0;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言如何實(shí)現(xiàn)三子棋

    C語言如何實(shí)現(xiàn)三子棋

    這篇文章主要介紹了C語言如何實(shí)現(xiàn)三子棋問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • C語言深入講解動(dòng)態(tài)內(nèi)存分配函數(shù)的使用

    C語言深入講解動(dòng)態(tài)內(nèi)存分配函數(shù)的使用

    這篇文章主要介紹了C語言動(dòng)態(tài)內(nèi)存分配,C語言內(nèi)存管理相關(guān)的函數(shù)主要有realloc、calloc、malloc、free、柔性數(shù)組等,下面這篇文章帶大家了解一下
    2022-05-05
  • C++的sstream標(biāo)準(zhǔn)庫(kù)詳細(xì)介紹

    C++的sstream標(biāo)準(zhǔn)庫(kù)詳細(xì)介紹

    以下是對(duì)C++中的的sstream標(biāo)準(zhǔn)庫(kù)進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下
    2013-09-09
  • C++基礎(chǔ)入門篇之強(qiáng)制轉(zhuǎn)換

    C++基礎(chǔ)入門篇之強(qiáng)制轉(zhuǎn)換

    這篇文章主要給大家介紹了關(guān)于C++基礎(chǔ)入門篇之強(qiáng)制轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++將模板實(shí)現(xiàn)放入頭文件原理解析

    C++將模板實(shí)現(xiàn)放入頭文件原理解析

    這篇文章主要為大家介紹了C++將模板實(shí)現(xiàn)放入頭文件原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • C++詳解PIMPL指向?qū)崿F(xiàn)的指針

    C++詳解PIMPL指向?qū)崿F(xiàn)的指針

    PIMPL 是 C++ 中的一個(gè)編程技巧,意思為指向?qū)崿F(xiàn)的指針。具體操作是把類的實(shí)現(xiàn)細(xì)節(jié)放到一個(gè)單獨(dú)的類中,并用一個(gè)指針進(jìn)行訪問
    2022-07-07
  • while和for可以相互轉(zhuǎn)換的例子分享

    while和for可以相互轉(zhuǎn)換的例子分享

    這篇文章主要介紹了while和for可以相互轉(zhuǎn)換的例子,需要的朋友可以參考下
    2014-02-02
  • C語言 完整游戲項(xiàng)目坦克大戰(zhàn)詳細(xì)代碼

    C語言 完整游戲項(xiàng)目坦克大戰(zhàn)詳細(xì)代碼

    《坦克大戰(zhàn)》以二戰(zhàn)坦克為題材,既保留了射擊類游戲的操作性,也改進(jìn)了射擊類游戲太過于復(fù)雜難玩的高門檻特點(diǎn),集休閑與競(jìng)技于一身。經(jīng)典再度襲來,流暢的畫面,瘋狂的戰(zhàn)斗,讓玩家再次進(jìn)入瘋狂坦克的世界。玩家的目標(biāo)是控制坦克躲避危險(xiǎn),消滅掉所有的敵人即可進(jìn)入下一關(guān)
    2021-11-11
  • Qt編寫地圖遷徙圖的實(shí)現(xiàn)示例

    Qt編寫地圖遷徙圖的實(shí)現(xiàn)示例

    本文主要介紹了Qt編寫地圖遷徙圖的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C語言實(shí)現(xiàn)單鏈表的基本功能詳解

    C語言實(shí)現(xiàn)單鏈表的基本功能詳解

    鏈表是一個(gè)結(jié)構(gòu)體實(shí)現(xiàn)的一種線性表,它只能從前往后,不可以從后往前,在實(shí)現(xiàn)單鏈表的操作時(shí),需要用指針來操作。本文主要介紹了實(shí)現(xiàn)單鏈表的基本功能的代碼示例,具有一定價(jià)值,感興趣的同學(xué)可以學(xué)習(xí)一下
    2021-11-11

最新評(píng)論

鄢陵县| 启东市| 五大连池市| 明星| 齐齐哈尔市| 鞍山市| 冕宁县| 韶山市| 吴旗县| 阿克| 马山县| 卓尼县| 太和县| 郴州市| 桂东县| 金坛市| 绥宁县| 汉源县| 大新县| 嘉荫县| 如皋市| 调兵山市| 论坛| 伊宁县| 馆陶县| 辽阳县| 兰州市| 营山县| 成都市| 元谋县| 永城市| 新干县| 延长县| 山阳县| 博湖县| 彰武县| 平罗县| 本溪| 宜川县| 宕昌县| 裕民县|