声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1671|回复: 0

[C/C++] 标准整数(vector)

[复制链接]
发表于 2006-11-22 10:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
  1. #include<math.h>
  2. #include<iostream.h>
  3. #include<stdio.h>
  4. #include<conio.h>
  5. #include<vector>
  6. #define LL_MAX 100
  7. using namespace std;
  8. class LLong
  9. {
  10. private:
  11. vector<long> a;
  12. int m;
  13. int cp;
  14. private:
  15. int LL_BJ(const LLong &B);
  16. LLong Help_Add(const LLong &B);
  17. LLong Help_Sub(const LLong &B);
  18. void LL_Div01(const LLong &B,LLong &Q01,LLong &R01);
  19. void LL_Div02(const LLong &B,LLong &Q02,LLong &R02);
  20. void LL_Div03(const LLong &B,LLong &Q03,LLong &R03);
  21. void LL_Div(const LLong &B,LLong &Q,LLong &R);
  22. public:
  23. LLong();
  24. LLong(char *s);
  25. LLong(long d);
  26. ~LLong()
  27. { ;  }
  28. void print();
  29. long get_a(int n);
  30. int get_m();
  31. int get_cp();
  32. public:
  33. LLong operator+(const LLong &B);
  34. LLong operator-(const LLong &B);
  35. LLong operator*(const LLong &B);
  36. LLong operator^(const LLong &B);
  37. LLong operator%(const LLong &B);
  38. LLong operator/(const LLong &B);
  39. int operator==(const LLong &B);
  40. int operator!=(const LLong &B);
  41. int operator>(const LLong &B);
  42. int operator>=(const LLong &B){return(*this>B||*this==B);}
  43. int operator<(const LLong &B);
  44. int operator<=(const LLong &B){return(*this<B||*this==B);}
  45. };
  46. int main()
  47. {
  48. LLong a("8848");
  49. LLong b("4494");
  50. a.print();
  51. cout<<endl;
  52. b.print();
  53. cout<<endl;
  54. (a+b).print();
  55. cout<<endl;
  56. ((LLong)8-b).print();
  57. cout<<endl;
  58. (a*b).print();
  59. cout<<endl;
  60. (a*5).print();
  61. cout<<endl;
  62. (a/b).print();
  63. cout<<endl;
  64. (a%b).print();
  65. cout<<endl;
  66. (a^b).print();
  67. cout<<endl;
  68. a.print();
  69. cout<<endl;
  70. b.print();
  71. cout<<endl;
  72. if(a!=b)
  73.   cout<<"a!=b"<<endl;
  74. if(a>=b)
  75.   cout<<"a>=b"<<endl;
  76. if(a<=b)
  77.   cout<<"a<=b"<<endl;
  78. if(a<b)
  79.   cout<<"a<b"<<endl;
  80. else if(a==b)
  81.   cout<<"a==b"<<endl;
  82. else
  83.   cout<<"a>b"<<endl;
  84. return 0;
  85. }
  86. LLong::LLong()
  87. {
  88.   a.resize(LL_MAX);
  89.   a[0]=0;
  90.   m=0;
  91.   cp=0;
  92. }
  93. LLong::LLong(char *s)
  94. {
  95. int n,i,t;
  96. a.resize(LL_MAX);
  97. if(*s=='-')
  98. {
  99.   cp=1;
  100.   n=-1;
  101. }
  102. else if(*s=='+')
  103. {
  104.   cp=0;
  105.   n=-1;
  106. }
  107. else
  108. {
  109.   cp=0;
  110.   n=0;
  111. }
  112. while(*s!='\0')
  113. {
  114.   n++;
  115.   s++;
  116. }
  117. if(n%4==0)
  118. {
  119.   n=n/4;
  120.   t=4;
  121. }
  122. else
  123. {
  124.   t=n%4;
  125.   n=n/4+1;
  126. }
  127. if(n==0)
  128.   cout<<"Not have dat"<<endl;
  129. if(n>LL_MAX)
  130.   a.resize(n);
  131. m=n-1;
  132. for(i=0;i<n-1;i++)
  133.   a[i]=*(s-1-4*i)-48+(*(s-2-4*i)-48)*10+
  134.    (*(s-3-4*i)-48)*100+(*(s-4-4*i)-48)*1000;
  135. a[n-1]=0;
  136. for(i=1;i<=t;i++)
  137.   a[n-1]=a[n-1]+(*(s-i-4*(n-1))-48)*(int)pow(10,i-1);
  138. }
  139. LLong::LLong(long d)
  140. {
  141. a.resize(LL_MAX);
  142. if(d<0)
  143.   cp=1;
  144. else
  145.   cp=0;
  146. d=abs(d);
  147. if(d<10000)
  148. {
  149.   m=0;
  150.   a[0]=d;
  151. }
  152. else if(d<100000000)
  153. {
  154.   m=1;
  155.   a[0]=d%10000;
  156.   d=(d-d%10000)/10000;
  157.   a[1]=d%10000;
  158. }
  159. else
  160. {
  161.   m=2;
  162.   a[0]=d%10000;
  163.   d=(d-d%10000)/10000;
  164.   a[1]=d%10000;
  165.   d=(d-d%10000)/10000;
  166.   a[2]=d%10000;
  167. }
  168. }
  169. void LLong::print()
  170. {
  171. long i,b[4];
  172. char aa[4];
  173. if(cp==1)
  174.   printf("-");
  175. printf("%ld",a[m]);
  176. for(i=m-1;i>=0;i--)
  177. {
  178.   b[0]=a[i]%10;
  179.   b[1]=((a[i]-b[0])/10)%10;
  180.   b[2]=((a[i]-b[0]-b[1]*10)/100)%10;
  181.   b[3]=((a[i]-b[0]-b[1]*10-b[2]*100)/1000)%10;
  182.   aa[0]=b[0]+48;
  183.   aa[1]=b[1]+48;
  184.   aa[2]=b[2]+48;
  185.   aa[3]=b[3]+48;
  186.   printf("%c%c%c%c",aa[3],aa[2],aa[1],aa[0]);
  187. }

  188. }
  189. long LLong::get_a(int n)
  190. {
  191. if((n>m)||(n<0))
  192. {
  193.   cout<<"溢出"<<endl;
  194.   return 0;
  195. }
  196. else
  197.   return a[n];
  198. }
  199. int LLong::get_cp()
  200. {
  201. return cp;
  202. }
  203. int LLong::get_m()
  204. {
  205. return m;
  206. }
  207. int LLong::LL_BJ(const LLong &B)
  208. {
  209. int i;
  210. if(m>B.m)
  211.   return 1;
  212. else if(m<B.m)
  213.   return -1;
  214. else
  215. {
  216.   for(i=m;i>=0;i--)
  217.   {
  218.    if(a[i]>B.a[i])
  219.     return 1;
  220.    else if(a[i]<B.a[i])
  221.     return -1;
  222.   }
  223.   return 0;
  224. }
  225. }
  226. int LLong::operator==(const LLong &B)
  227. {
  228. if(cp!=B.cp)
  229.   return 0;
  230. if(LL_BJ(B)==0)
  231.   return 1;
  232. else
  233.   return 0;
  234. }
  235. int LLong::operator!=(const LLong &B)
  236. {
  237. if((LL_BJ(B)==0)&&(cp==B.cp))
  238.   return 0;
  239. else
  240.   return 1;
  241. }
  242. int LLong::operator<(const LLong &B)
  243. {
  244. if(cp>B.cp)
  245.   return 1;
  246. else if(cp<B.cp)
  247.   return 0;
  248. else
  249. {
  250.   if(((cp==0)&&(LL_BJ(B)==-1))||((cp==1)&&(LL_BJ(B)==1)))
  251.    return 1;
  252.   else
  253.    return 0;
  254. }
  255.   
  256. }
  257. int LLong::operator>(const LLong &B)
  258. {
  259. if(cp>B.cp)
  260.   return 0;
  261. else if(cp<B.cp)
  262.   return 1;
  263. else
  264. {
  265.   if(((cp==0)&&(LL_BJ(B)==1))||((cp==1)&&(LL_BJ(B)==-1)))
  266.    return 1;
  267.   else
  268.    return 0;
  269. }
  270. }
  271. LLong LLong::Help_Add(const LLong &B)
  272. {
  273. LLong D;
  274. int i;
  275. for(i=0;i<=m;i++)
  276. {
  277.   if(i<=B.m)
  278.   {
  279.    if(i+2>LL_MAX)D.a.resize(i+2);
  280.    D.a[i+1]=(D.a[i]+a[i]+B.a[i])/10000;
  281.    D.a[i]=(D.a[i]+a[i]+B.a[i])%10000;
  282.   }
  283.   else
  284.   {
  285.    if(i+2>LL_MAX)D.a.resize(i+2);
  286.    D.a[i+1]=(D.a[i]+a[i])/10000;
  287.    D.a[i]=(D.a[i]+a[i])%10000;
  288.   }
  289. }
  290. if(D.a[m+1]==0)
  291.   D.m=m;
  292. else
  293.   D.m=m+1;
  294. return D;
  295. }
  296. LLong LLong::Help_Sub(const LLong &B)
  297. {
  298. LLong D;
  299. int i,y=0;
  300. for(i=0;i<=m;i++)
  301. {
  302.   if(i<=B.m)
  303.   {
  304.    if(a[i]-y>=B.a[i])
  305.    {   
  306. if(i+1>LL_MAX)D.a.resize(i+1);
  307.     D.a[i]=a[i]-y-B.a[i];
  308.     y=0;
  309.    }
  310.    else
  311.    {   
  312. if(i+1>LL_MAX)D.a.resize(i+1);
  313.     D.a[i]=10000+a[i]-y-B.a[i];
  314.     y=1;
  315.    }
  316.   }
  317.   else
  318.   {
  319.    if(a[i]-y>=0)
  320.    {
  321. if(i+1>LL_MAX)D.a.resize(i+1);
  322.     D.a[i]=a[i]-y;
  323.     y=0;
  324.    }
  325.    else
  326.    {
  327. if(i+1>LL_MAX)D.a.resize(i+1);
  328.     D.a[i]=10000+a[i]-y;
  329.     y=1;
  330.    }
  331.   }
  332. }
  333. for(i=m;i>=0;i--)
  334.   if(D.a[i]!=0)
  335.   {
  336.    D.m=i;
  337.    break;
  338.   }
  339. return D;
  340. }
  341. LLong LLong::operator+(const LLong &B)
  342. {
  343. LLong D,AA,BB=B;
  344. if(m+1>LL_MAX)AA.a.resize(m+1);
  345. for(int i=0;i<=m;i++)
  346.   AA.a[i]=a[i];
  347. AA.m=m;
  348. AA.cp=cp;
  349. if((LL_BJ(BB)==1)||(LL_BJ(BB)==0))
  350. {
  351.   if(cp==B.cp)
  352.   {
  353.    D=Help_Add(BB);
  354.    D.cp=cp;
  355.   }
  356.   else if((cp==0)&&(B.cp==1))
  357.   {
  358.    D=Help_Sub(BB);
  359.    D.cp=0;
  360.   }
  361.   else
  362.   {
  363.    D=Help_Sub(BB);
  364.    D.cp=1;
  365.   }
  366. }
  367. else
  368. {
  369.   if(BB.m+1>LL_MAX)
  370. a.resize(BB.m+1);
  371.   cp=BB.cp;m=BB.m;
  372.   for(i=0;i<=BB.m;i++)
  373.    a[i]=BB.a[i];
  374.   BB=AA;
  375.   if(cp==BB.cp)
  376.   {
  377.    D=Help_Add(BB);
  378.    D.cp=cp;
  379.   }
  380.   else if((cp==0)&&(BB.cp==1))
  381.   {
  382.    D=Help_Sub(BB);
  383.    D.cp=0;
  384.   }
  385.   else
  386.   {
  387.    D=Help_Sub(BB);
  388.    D.cp=1;
  389.   }
  390. }
  391. if(AA.m+1>LL_MAX)a.resize(AA.m+1);
  392. cp=AA.cp;
  393. m=AA.m;
  394. for(i=0;i<=AA.m;i++)
  395.   a[i]=AA.a[i];
  396. return D;
  397. }
  398. LLong LLong::operator-(const LLong &B)
  399. {
  400. LLong D,AA,BB=B;
  401. if(m+1>LL_MAX)AA.a.resize(m+1);
  402. for(int i=0;i<=m;i++)
  403.   AA.a[i]=a[i];
  404. AA.m=m;
  405. AA.cp=cp;
  406. if((LL_BJ(BB)==1)||(LL_BJ(BB)==0))
  407. {
  408.   if(cp==BB.cp)
  409.   {
  410.    D=Help_Sub(BB);
  411.    D.cp=cp;
  412.   }
  413.   else if((cp==0)&&(BB.cp==1))
  414.   {
  415.    D=Help_Add(BB);
  416.    D.cp=0;
  417.   }
  418.   else
  419.   {
  420.    D=Help_Add(BB);
  421.    D.cp=1;
  422.   }
  423. }
  424. else
  425. {
  426.   if(BB.m+1>LL_MAX)
  427. a.resize(BB.m+1);
  428.   cp=BB.cp;m=BB.m;
  429.   for(i=0;i<=BB.m;i++)
  430.    a[i]=BB.a[i];
  431.   BB=AA;
  432.   if(cp==BB.cp)
  433.   {
  434.    D=Help_Sub(BB);
  435.    if(cp==1)
  436.     D.cp=0;
  437.    if(cp==0)
  438.     D.cp=1;
  439.   }
  440.   else if((cp==0)&&(BB.cp==1))
  441.   {
  442.    D=Help_Add(BB);
  443.    D.cp=1;
  444.   }
  445.   else
  446.   {
  447.    D=Help_Add(BB);
  448.    D.cp=0;
  449.   }
  450. }
  451. if(AA.m+1>LL_MAX)a.resize(AA.m+1);
  452. cp=AA.cp;
  453. m=AA.m;
  454. for(i=0;i<=m;i++)
  455.   a[i]=AA.a[i];
  456. return D;
  457. }
  458. LLong LLong::operator*(const LLong &B)
  459. {
  460. LLong F,D;
  461. int i,j,k;
  462. if(cp==B.cp)
  463.   k=0;
  464. else
  465.   k=1;
  466. LLong G=B;
  467. G.cp=0;
  468. for(j=0;j<=G.m;j++)
  469. {
  470.   for(i=0;i<j+m+2;i++)/*sugaigua*/
  471.   {
  472.    if(i+1>LL_MAX)
  473.     D.a.resize(i+1);  
  474.    D.a[i]=0;
  475.   }
  476.   D.m=j+m+1;
  477.   for(i=j;i<=j+m;i++)
  478.   {
  479.    D.a[i+1]=(D.a[i]+G.a[j]*a[i-j])/10000;
  480.    D.a[i]=(D.a[i]+G.a[j]*a[i-j])%10000;
  481.   }
  482.   if(D.a[j+m+1]==0)
  483.    D.m=j+m;
  484.   D.cp=0;
  485.   F=F+D;
  486. }
  487. F.cp=k;
  488. return F;
  489. }
  490. LLong LLong::operator^(const LLong &B)
  491. {
  492. LLong AA,d,W,BB=B,T(1),D(1);
  493. if(BB<W)
  494. {
  495.   cout<<"指数不能负"<<endl;
  496.   return 1;
  497. }
  498. if(m+1>LL_MAX)AA.a.resize(m+1);
  499. AA.m=m;
  500. AA.cp=cp;
  501. for(int i=0;i<=m;i++)
  502.   AA.a[i]=a[i];
  503. for(d=W;d<BB;d=d+T)
  504. {
  505.   D=D*AA;
  506. }
  507. return D;
  508. }
  509. void LLong::LL_Div01(const LLong &B,LLong &Q,LLong &R)
  510. {
  511. int i,n;
  512. LLong F,W,T(1);
  513. LLong AA,BB=B;
  514. if(m+1>LL_MAX)AA.a.resize(m+1);
  515. AA.m=m;
  516. AA.cp=cp;
  517. for(i=0;i<=m;i++)
  518.   AA.a[i]=a[i];
  519. AA.cp=BB.cp=0;
  520. if(LL_BJ(BB)==-1)
  521. {
  522.   R=AA;
  523.   Q=W;
  524. }
  525. else if(LL_BJ(BB)==0)
  526. {
  527.   R=W;
  528.   Q=T;
  529. }
  530. else
  531. {
  532.   n=AA.m-BB.m;
  533.   for(i=0;i<n;i++)
  534.   {
  535.    if(i+1>LL_MAX)
  536.     F.a.resize(i+1);
  537.    F.a[i]=0;
  538.   }
  539.   if(AA.a[AA.m]>=BB.a[BB.m])
  540.   {
  541.    if(n+1>LL_MAX)F.a.resize(n+1);
  542.    F.a[n]=AA.a[AA.m]/BB.a[BB.m];
  543.    F.m=n;
  544.   }
  545.   else
  546.   {
  547.    F.a[n-1]=(AA.a[AA.m]*10000+AA.a[AA.m-1])/BB.a[BB.m];
  548.    F.m=n-1;
  549.   }
  550.   F.cp=0;
  551.   Q=F;
  552.   R=AA-BB*F;
  553. }
  554. }
  555. void LLong::LL_Div02(const LLong &B,LLong &Q,LLong &R)
  556. {
  557. LLong W,AA,BB=B;
  558. if(m+1>LL_MAX)AA.a.resize(m+1);
  559. AA.m=m;
  560. AA.cp=cp;
  561. for(int i=0;i<=m;i++)
  562.   AA.a[i]=a[i];
  563. BB.cp=0;
  564. if(cp==0)
  565.   LL_Div01(BB,Q,R);
  566. else
  567. {
  568.   LL_Div01(BB,Q,R);
  569. if(Q!=W)
  570.    Q.cp=1;
  571. if(R!=W)
  572.   {
  573.    if(R.cp==0)
  574.     R.cp=1;
  575.    else
  576.     R.cp=0;
  577.   }
  578. }
  579.    if(AA.m+1>LL_MAX)a.resize(AA.m+1);
  580.    cp=AA.cp;
  581.    m=AA.m;
  582.    for(i=0;i<=AA.m;i++)
  583.     a[i]=AA.a[i];
  584.    return;
  585. }
  586. void LLong::LL_Div03(const LLong &B,LLong &Q,LLong &R)
  587. {
  588. LLong W,AAA,AA,QQ,RR,T(1),BB=B;
  589. if(m+1>LL_MAX)AA.a.resize(m+1);
  590. AA.m=m;
  591. AA.cp=cp;
  592. for(int i=0;i<=m;i++)
  593.   AA.a[i]=a[i];
  594. AAA=AA;
  595. AA.cp=BB.cp=0;
  596. while(1)
  597. {
  598.   LL_Div02(BB,QQ,RR);
  599.   if(RR.m+1>LL_MAX)a.resize(RR.m+1);
  600.   cp=RR.cp;
  601.   m=RR.m;
  602.   for(i=0;i<=RR.m;i++)
  603.    a[i]=RR.a[i];
  604.   if(LL_BJ(BB)==-1)
  605.   {
  606.    if(RR.cp==0)
  607.    {
  608.     R=RR;
  609.     Q=Q+QQ;
  610.    }
  611.    else
  612.    {
  613.     R=BB+RR;
  614.     Q=Q+QQ-T;
  615.    }
  616.    if(AAA.m+1>LL_MAX)a.resize(AAA.m+1);
  617.    cp=AAA.cp;
  618.    m=AAA.m;
  619.    for(i=0;i<=AAA.m;i++)
  620.     a[i]=AAA.a[i];
  621.    return;
  622.   }
  623.    if(RR.m+1>LL_MAX)a.resize(RR.m+1);
  624.    cp=RR.cp;
  625.    m=RR.m;
  626.    for(i=0;i<=RR.m;i++)
  627.     a[i]=RR.a[i];
  628.    Q=Q+QQ;
  629.   
  630. }
  631. }
  632. void LLong::LL_Div(const LLong &B,LLong &Q,LLong &R)
  633. {
  634. LLong W,AA,BB=B,AAA;
  635. if(m+1>LL_MAX)AA.a.resize(m+1);
  636. AA.m=m;
  637. AA.cp=cp;
  638. for(int i=0;i<=m;i++)
  639.   AA.a[i]=a[i];
  640. AAA=AA;
  641. if(BB==W)
  642. printf("Not to Div.");
  643. if((AA.cp==0)&&(BB.cp==0))
  644.   LL_Div03(BB,Q,R);
  645. else if((AA.cp==1)&&(BB.cp==1))
  646. {
  647.   cp=0;BB.cp=0;
  648.   LL_Div03(BB,Q,R);
  649. }
  650. else if((AA.cp==1)&&(BB.cp==0))
  651. {
  652.   cp=0;
  653.   LL_Div03(BB,Q,R);
  654. if(Q!=W)
  655.   Q.cp=1;
  656. if(R!=W)
  657.    R.cp=1;
  658. }
  659. else
  660. {
  661.   LL_Div03(BB,Q,R);
  662. if(Q!=W)
  663.    Q.cp=1;
  664. }
  665.    if(AAA.m+1>LL_MAX)a.resize(AAA.m+1);
  666.    cp=AAA.cp;
  667.    m=AAA.m;
  668.    for(i=0;i<=AAA.m;i++)
  669.     a[i]=AAA.a[i];
  670.    return;
  671. }
  672. LLong LLong::operator%(const LLong &B)
  673. {
  674. LLong Q,R;
  675. LL_Div(B,Q,R);
  676. return R;
  677. }

  678. LLong LLong::operator/(const LLong &B)
  679. {
  680. LLong Q,R;
  681. LL_Div(B,Q,R);
  682. return Q;
  683. }
复制代码

[ 本帖最后由 风花雪月 于 2006-11-29 07:30 编辑 ]

评分

1

查看全部评分

回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-11 13:50 , Processed in 0.063640 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表