c++实现高精度乘法!
生活随笔
收集整理的這篇文章主要介紹了
c++实现高精度乘法!
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
????用C++寫了個大數相乘,下面是源碼:
#include<iostream>
#include<string>
#include<iomanip>
class?HighMutiply{
????private:
????????const?int?MAX;
????????int?*_mutiplier;
????????int?*_mutipliee;
????????int?*_result;
????????int?_lenlier;
????????int?_lenliee;
????????int?_lenResult;
????public:
????????HighMutiply(int?max=1000)
????????:MAX(max),_lenliee(0),_lenlier(0),_lenResult(0)
????????{
????????????_mutiplier?=?new?int[MAX];
????????????_mutipliee?=?new?int[MAX];
????????????_result?=?new?int[MAX?*?MAX];
????????}
//將輸入字符串按4位一組轉化為整型數組
????????void?stringToInt(char?*s1,char?*s2)
????????{
????????????char?temp[5];
????????????int?len_s1=?strlen(s1);
????????????int?len_s2=?strlen(s2);
????????????while(len_s1>4)
????????????{
????????????????strncpy(temp,&s1[len_s1-4],4);
????????????????temp[5]='\0';
????????????????_mutiplier[_lenlier++]=atoi(temp);
????????????????len_s1?-=?4;
????????????????s1[len_s1]='\0';????
????????????}
????????????if(len_s1>0)
????????????????_mutiplier[_lenlier++]=atoi(s1);
????????????????
????????????while(len_s2>4)
????????????{
????????????????strncpy(temp,&s2[len_s2-4],4);
????????????????temp[5]='\0';
????????????????_mutipliee[_lenliee++]=atoi(temp);
????????????????len_s2?-=?4;
????????????????s2[len_s2]='\0';????
????????????}
????????????if(len_s2>0)
????????????????_mutipliee[_lenliee++]=atoi(s2);
????????}
//計算,結果存入_result[]中
????????void?Calculation()
????????{
????????????int?temp,carry;
????????????int?i,j,count;
????????????for(i=0;i<MAX*MAX;i++)
????????????{
????????????????_result[i]=0;
????????????}
????????????for(i?=?0,?carry?=?0;?i?<?_lenliee;?i++?)
????????????{
????????????????
????????????????for(?j?=?1,?count?=?j+i-1;?j?<=?_lenlier;?j++)
????????????????{
????????????????????temp?=?_mutipliee[i]?*?_mutiplier[j-1]?+?carry?+?_result[count];
????????????????????_result[count++]?=??temp?%?10000;
????????????????????carry?=?temp?/?10000;//存儲進位
????????????????}
????????????????while(?carry?)
????????????????{
????????????????????_result[count++]?+=?(carry?%?10000);
????????????????????carry?=?carry?/?10000;
????????????????}
????????????}
????????????_lenResult=count;????????
????????}
????????void?display()
????????{
????????????int?temp,j;
????????????cout?<<?_mutiplier[_lenlier-1];
????????????for(int?i?=?_lenlier-2;?i?>=?0;?i--)
????????????{
????????????????if(_mutiplier[i]?==?0)
????????????????{
????????????????????cout<<"0000";
????????????????}
????????????????else
????????????????{
????????????????????for(j=4,temp=_mutiplier[i];temp;j--,temp/=10)
????????????????????{}
????????????????????while(--j?>=?0)
????????????????????{
????????????????????????cout<<"0";
????????????????????}
????????????????????cout?<<?_mutiplier[i];
????????????????}
????????????}
????????????cout?<<?"?*?"?<<?_mutipliee[_lenliee-1];
????????????
????????????for(int?i?=?_lenliee-2;?i?>=?0;?i--)
????????????{
????????????????if(_mutipliee[i]?==?0)
????????????????{
????????????????????cout<<"0000";
????????????????}
????????????????else
????????????????{
????????????????????for(j=4,temp=_mutipliee[i];temp;j--,temp/=10)
????????????????????{}
????????????????????while(--j?>=?0)
????????????????????cout<<"0";
????????????????????cout?<<?_mutipliee[i];
????????????????}
????????????}
????????????cout?<<?"?="?<<?endl?<<?_result[_lenResult-1];
????????????for(int?i?=?_lenResult-2;?i?>=?0;?i--)
????????????{
????????????????if(?_result[i]?==?0?)
????????????????{
????????????????????cout<<"0000";
????????????????}
????????????????else
????????????????{
????????????????????for(j=4,temp=_result[i];temp;j--,temp/=10)
????????????????????{}
????????????????????while(--j?>=?0)
????????????????????????cout<<"0";
????????????????????cout?<<?_result[i];
????????????????}
????????????}
????????????cout<<endl;
????????}
????????~HighMutiply()
????????{
????????????delete[]?_mutipliee;
????????????delete[]?_mutiplier;
????????????delete[]?_result;
????????}
};
int?main()
{
????string?s1,s2;
????cin>>s1>>s2;
????int?l1=s1.length();
????int?l2=s2.length();
????char?*c1=new?char[l1];
????char?*c2=new?char[l2];
????strcpy(c1,s1.c_str());
????strcpy(c2,s2.c_str());
????
????HighMutiply?hi;
?????hi.stringToInt(c1,c2);????
????hi.Calculation();
????hi.display();
????
????delete[]?c1;
????delete[]?c2;
????
????return?0;
}
????本來輸入字符串想使用string類,但在VC6.0中運行老出現錯誤,查了MSDN后,發現是VC中存在的固有錯誤,后來將其改為C風格的字符串了。 程序在C-Free4.0中編譯通過。
轉載于:https://www.cnblogs.com/chengy024/archive/2008/04/07/1140341.html
總結
以上是生活随笔為你收集整理的c++实现高精度乘法!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我们都是和自己赛跑的人
- 下一篇: 解决vc 6在vista下的一些兼容问题