算法思想比较简单,计算过程类似小学学习乘法的竖式,主要考虑进位及错位相加,由于位数不限,因此涉及大数相加
更高级的大数乘法可参考
分治法:http://cnn237111.blog.51cto.com/2359144/1201901
FFT方法:http://www.cnblogs.com/lsx54321/archive/2012/07/20/2601632.html
3 . 1 4
X 2 . 7 1
-----------------
3 1 4
2 1 9 8
+ 6 2 8
-----------------
= 8 5 0 9 4
然后根据两数小数总位数为4,在85094从右往左数4位插入小数点,即8.5094
#define SHOW_BIG_NUMBER_MULTIPLY_PROC 0 // 是否显示大数相乘的过程0/1
#define SHOW_BIG_NUMBER_MULTIPLY_RESULT 0 // 是否显示大数相乘的结果0/1
bool isDigit(char v)
{
return v >= '0' && v <= '9';
}
// 获取小数点位置
int getDotPos(const char *v)
{
if (NULL == v) {
cout << "[ERROR] getDotPos, NULL pointer input!" << endl;
return -1;
}
int i = 0;
int len = strlen(v);
int dotPos = -1, dotNum = 0;
if (len < 1 || (len == 1 && v[0] == '.')) return -1;
for(i = len-1; i >= 0; --i) {
if (!isDigit(v[i])) {
if (v[i] == '.') {
dotPos = len-1-i;
dotNum++;
if (dotNum > 1) return -1;
} else {
return -1;
}
}
}
return dotNum==0 ? 0 : dotPos;
}
// 大整数加法
char* bigIntegerAdd(const char *v1, const char *v2)
{
if (NULL == v1 || NULL == v2) {
cout << "[ERROR] bigIntegerAdd, NULL pointer input!" << endl;
return NULL;
}
char *tv1 = new char[strlen(v1)+1];
char *tv2 = new char[strlen(v2)+1];
int tk = 0;
for (tk = 0; tk < strlen(v1); ++tk) {
if (v1[tk] != '0') break;
}
if (tk == strlen(v1)) {
tv1[0] = '0';
tv1[1] = '\0';
} else {
memcpy(tv1, v1+tk, strlen(v1)-tk+1);
}
for (tk = 0; tk < strlen(v2); ++tk) {
if (v2[tk] != '0') break;
}
if (tk == strlen(v2)) {
tv2[0] = '0';
tv2[1] = '\0';
} else {
memcpy(tv2, v2+tk, strlen(v2)-tk+1);
}
int len1 = strlen(tv1);
int len2 = strlen(tv2);
int maxLen = len1 > len2 ? len1 : len2;
char *addOut = new char[maxLen+1+1];
memset(addOut, '0', maxLen+1+1);
addOut[maxLen+1]='\0';
int idx1 = len1-1, idx2 = len2-1, k = maxLen;
int lastCarry = 0;
for (int i=maxLen; i >= 0; --i)
{
int t1 = 0;
if (idx1 >= 0 && tv1[idx1] != '\0') t1 = tv1[idx1] - '0';
int t2 = 0;
if (idx2 >= 0 && tv2[idx2] != '\0') t2 = tv2[idx2] - '0';
int t = t1+t2;
int carryBit = (t+lastCarry)/10;
int mod = t+lastCarry - carryBit*10;
addOut[k--] = mod + '0';
lastCarry = carryBit;
--idx1;
--idx2;
}
char *retOut = new char[maxLen+1+1];
retOut[maxLen+1] = '\0';
for (tk = 0; tk < strlen(addOut); ++tk) {
if (addOut[tk] != '0') break;
}
if (tk == strlen(addOut)) {
retOut[0] = '0';
retOut[1] = '\0';
} else {
memcpy(retOut, addOut+tk, strlen(addOut)-tk+1);
}
//cout << v1 << "+" << v2 << "=" << retOut << endl;
delete [] addOut;
delete [] tv1;
delete [] tv2;
return retOut;
}
// 大数乘法,理论计算的数值不限,但由于每个输入的字符串最长为0xffffffff个字符(strlen计算上限),因此可支持0xffffffff^2的最大位数
// 即18446744065119617025位的数字(若结果保存的硬盘需要16383.99999PB,1PB=1024TB=1048576GB)
char* bigNumberMultiply(const char *v1, const char *v2)
{
if (NULL == v1 || NULL == v2) {
cout << "[ERROR] bigNumberMultiply, NULL pointer input!" << endl;
return NULL;
}
int dot1 = getDotPos(v1);
int dot2 = getDotPos(v2);
int dot = dot1 + dot2;
int len1 = strlen(v1);
int len2 = strlen(v2);
if (dot1 < 0) {
cout << v1 << " X " << v2 << endl;
cout << "[ERROR] bigNumberMultiply, the first param is not a regular digit value!" << endl;
return NULL;
}
if (dot2 < 0) {
cout << v1 << " X " << v2 << endl;
cout << "[ERROR] CExamples::bigNumberMultiply, the second param is not a regular value!" << endl;
return NULL;
}
int nNum1 = (len1 - (dot1 != 0)); // v1数字个数
int nNum2 = (len2 - (dot2 != 0)); // v2数字个数
#if SHOW_BIG_NUMBER_MULTIPLY_RESULT
cout << "dot1=" << dot1 << ",dot2=" << dot2 << endl;
cout << "significant bit of nNum1=" << nNum1 << ", significant bit of nNum2=" << nNum2 << endl;
cout << "now calculating, please wait ..." << endl;
#endif
int nAdd = 0; // 相加的次数,每增加1次,则当前乘法的结果需要乘以10(错位)
char *tmpCurOut = new char[nNum1+nNum2+1+1]; // 保存每次乘法的临时结果,最后需要加'\0'
char *tmpAddOut = NULL;
char *tmpMulOut = NULL;
for (int i = len2-1; i >= 0; --i) {
if (v2[i] == '.') continue;
int t2 = v2[i] - '0';
char lowBit = '0';
int lastCarry = 0;
memset(tmpCurOut, '0', nNum1+nNum2+1+1);
tmpCurOut[nNum1+nNum2+1] = '\0';
int tmpK = nNum1+nNum2;
for (int j = len1-1; j >= 0; --j) {
if (v1[j] == '.') {
if (j==0) {
tmpCurOut[tmpK-nAdd] = lastCarry + '0'; // 最左边为小数点,补上之前的进位
}
continue;
}
int t1 = v1[j] - '0';
int t = t1*t2;
int carryBit = (t+lastCarry)/10; // 进位
int mod = t+lastCarry-carryBit*10; // 余数
lowBit = mod%10 + '0';
tmpCurOut[tmpK-nAdd] = lowBit; // 错位
if (j==0) {
tmpCurOut[tmpK-nAdd-1] = carryBit + '0'; // 最左边的进位
}
lastCarry = carryBit;
--tmpK;
}
#if SHOW_BIG_NUMBER_MULTIPLY_PROC
cout << "+" ;
for (int nSpace=0; nSpace 0) { // 当前值和上次相加的结果进行累加,累加完成即相乘的最终值
#if SHOW_BIG_NUMBER_MULTIPLY_PROC
cout << endl;
cout << tmpAddOut << "+" << tmpCurOut;
#endif
tmpMulOut = bigIntegerAdd(tmpAddOut, tmpCurOut);
delete [] tmpAddOut;
tmpAddOut = NULL;
#if SHOW_BIG_NUMBER_MULTIPLY_PROC
cout << "=" << tmpMulOut;
#endif
tmpAddOut = tmpMulOut;
}
#if SHOW_BIG_NUMBER_MULTIPLY_PROC
cout << endl;
#endif
++nAdd;
}
if (NULL == tmpMulOut) {
delete [] tmpCurOut;
if (NULL != tmpAddOut) {
delete [] tmpAddOut;
tmpAddOut = NULL;
}
if (NULL != tmpMulOut) {
delete [] tmpMulOut;
tmpMulOut = NULL;
}
#if SHOW_BIG_NUMBER_MULTIPLY_RESULT
cout << "0" << endl;
#endif
return NULL;
}
#if SHOW_BIG_NUMBER_MULTIPLY_PROC
cout << tmpMulOut << endl;
#endif
if (dot > 0) { // 插入小数点
char* retOut = NULL;
int lenMulOut = strlen(tmpMulOut);
if (lenMulOut-dot >= 0) {
retOut = new char[lenMulOut+1+1];
retOut[lenMulOut+1] = '\0';
memcpy(retOut, tmpMulOut, lenMulOut-dot); // 整数部分
retOut[lenMulOut-dot] = '.';
memcpy(retOut+lenMulOut-dot+1, tmpMulOut+lenMulOut-dot, dot); // 小数部分
} else { // 结果数长度小于小数点位数,需要补齐dot-strlen(tmpMulOut)个'0',再添加'0.'
retOut = new char[dot+1+1+1];
retOut[0] = '0';
retOut[1] = '.';
retOut[dot+1+1] = '\0';
memset(retOut+2, '0', dot-lenMulOut);
memcpy(retOut+2+dot-lenMulOut, tmpMulOut, lenMulOut);
}
if (retOut[0] == '.') { // 结果第一位是小数点,前面补一个0
char* retOutFix = new char[strlen(retOut)+2];
retOutFix[0] = '0';
memcpy(retOutFix+1, retOut, strlen(retOut));
retOutFix[strlen(retOut)+1] = '\0';
delete [] retOut;
delete [] tmpCurOut;
delete [] tmpMulOut;
#if SHOW_BIG_NUMBER_MULTIPLY_RESULT
cout << v1 << " X " << v2 << " = " << retOutFix << endl;
cout << "Finish" << endl;
#endif
return retOutFix;
}
delete [] tmpCurOut;
delete [] tmpMulOut;
#if SHOW_BIG_NUMBER_MULTIPLY_RESULT
cout << v1 << " X " << v2 << " = " << retOut << endl;
cout << "Finish" << endl;
#endif
return retOut;
} else {
delete [] tmpCurOut;
#if SHOW_BIG_NUMBER_MULTIPLY_RESULT
cout << v1 << " X " << v2 << " = " << tmpMulOut << endl;
cout << "Finish" << endl;
#endif
return tmpMulOut;
}
}
// 测试示例:
cout << bigNumberMultiply("0.00001", "100") << endl;
cout << bigNumberMultiply("1", ".7") << endl;
cout << bigNumberMultiply("0.1", "0.7") << endl;
cout << bigNumberMultiply(".1", "0.7") << endl;
cout << bigNumberMultiply("9", "9") << endl;
cout << bigNumberMultiply("09", "9") << endl;
cout << bigNumberMultiply("2.7182818284590", "3.14159265358") << endl;
cout << bigNumberMultiply("3.14159265358", "2.7182818284590") << endl;
cout << bigNumberMultiply("123456789123456789", "123456789123456789") << endl;
// 输出:
0.00100
0.7
0.07
0.07
81
81
8.539734222646804172233220
8.539734222646804172233220
15241578780673678515622620750190521
这里没有考虑符号,符号很简单,若仅有一个前面的符号是'-',则在结果前面加'-'即可
测试采用欧拉数e(100位)和圆周率π(10000位)相乘,
π ≈ 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590099465764078951269468398352595709825822620522489407726719478268482601476990902640136394437455305068203496252451749399651431429809190659250937221696461515709858387410597885959772975498930161753928468138268683868942774155991855925245953959431049972524680845987273644695848653836736222626099124608051243884390451244136549762780797715691435997700129616089441694868555848406353422072225828488648158456028506016842739452267467678895252138522549954666727823986456596116354886230577456498035593634568174324112515076069479451096596094025228879710893145669136867228748940560101503308617928680920874760917824938589009714909675985261365549781893129784821682998948722658804857564014270477555132379641451523746234364542858444795265867821051141354735739523113427166102135969536231442952484937187110145765403590279934403742007310578539062198387447808478489683321445713868751943506430218453191048481005370614680674919278191197939952061419663428754440643745123718192179998391015919561814675142691239748940907186494231961567945208095146550225231603881930142093762137855956638937787083039069792077346722182562599661501421503068038447734549202605414665925201497442850732518666002132434088190710486331734649651453905796268561005508106658796998163574736384052571459102897064140110971206280439039759515677157700420337869936007230558763176359421873125147120532928191826186125867321579198414848829164470609575270695722091756711672291098169091528017350671274858322287183520935396572512108357915136988209144421006751033467110314126711136990865851639831501970165151168517143765761835155650884909989859982387345528331635507647918535893226185489632132933089857064204675259070915481416549859461637180270981994309924488957571282890592323326097299712084433573265489382391193259746366730583604142813883032038249037589852437441702913276561809377344403070746921120191302033038019762110110044929321516084244485963766983895228684783123552658213144957685726243344189303968642624341077322697802807318915441101044682325271620105265227211166039666557309254711055785376346682065310989652691862056476931257058635662018558100729360659876486117910453348850346113657686753249441668039626579787718556084552965412665408530614344431858676975145661406800700237877659134401712749470420562230538994561314071127000407854733269939081454664645880797270826683063432858785698305235808933065757406795457163775254202114955761581400250126228594130216471550979259230990796547376125517656751357517829666454779174501129961489030463994713296210734043751895735961458901938971311179042978285647503203198691514028708085990480109412147221317947647772622414254854540332157185306142288137585043063321751829798662237172159160771669254748738986654949450114654062843366393790039769265672146385306736096571209180763832716641627488880078692560290228472104031721186082041900042296617119637792133757511495950156604963186294726547364252308177036751590673502350728354056704038674351362222477158915049530984448933309634087807693259939780541934144737744184263129860809988868741326047215695162396586457302163159819319516735381297416772947867242292465436680098067692823828068996400482435403701416314965897940924323789690706977942236250822168895738379862300159377647165122893578601588161755782973523344604281512627203734314653197777416031990665541876397929334419521541341899485444734567383162499341913181480927777103863877343177207545654532207770921201905166096280490926360197598828161332316663652861932668633606273567630354477628035045077723554710585954870279081435624014517180624643626794561275318134078330336254232783944975382437205835311477119926063813346776879695970309833913077109870408591337464144282277263465947047458784778720192771528073176790770715721344473060570073349243693113835049316312840425121925651798069411352801314701304781643788518529092854520116583934196562134914341595625865865570552690496520985803385072242648293972858478316305777756068887644624824685792603953527734803048029005876075825104747091643961362676044925627420420832085661190625454337213153595845068772460290161876679524061634252257719542916299193064553779914037340432875262888963995879475729174642635745525407909145135711136941091193932519107602082520261879853188770584297259167781314969900901921169717372784768472686084900337702424291651300500516832336435038951702989392233451722013812806965011784408745196012122859937162313017114448464090389064495444006198690754851602632750529834918740786680881833851022833450850486082503930213321971551843063545500766828294930413776552793975175461395398468339363830474611996653858153842056853386218672523340283087112328278921250771262946322956398989893582116745627010218356462201349671518819097303811980049734072396103685406643193950979019069963955245300545058068550195673022921913933918568034490398205955100226353536192041994745538593810234395544959778377902374216172711172364343543947822181852862408514006660443325888569867054315470696574745855033232334210730154594051655379068662733379958511562578432298827372319898757141595781119635833005940873068121602876496286744604774649159950549737425626901049037781986835938146574126804925648798556145372347867330390468838343634655379498641927056387293174872332083760112302991136793862708943879936201629515413371424892830722012690147546684765357616477379467520049075715552781965362132392640616013635815590742202020318727760527721900556148425551879253034351398442532234157623361064250639049750086562710953591946589751413103482276930624743536325691607815478181152843667957061108615331504452127473924544945423682886061340841486377670096120715124914043027253860764823634143346235189757664521641376796903149501910857598442391986291642193994907236234646844117394032659184044378051333894525742399508296591228508555821572503107125701266830240292952522011872676756220415420516184163484756516999811614101002996078386909291603028840026910414079288621507842451670908700069928212066041837180653556725253256753286129104248776182582976515795984703562226293486003415872298053498965022629174878820273420922224533985626476691490556284250391275771028402799806636582548892648802545661017296702664076559042909945681506526530537182941270336931378517860904070866711496558343434769338578171138645587367812301458768712660348913909562009939361031029161615288138437909904231747336394804575931493140529763475748119356709110137751721008031559024853090669203767192203322909433467685142214477379393751703443661991040337511173547191855046449026365512816228824462575916333039107225383742182140883508657391771509682887478265699599574490661758344137522397096834080053559849175417381883999446974867626551658276584835884531427756879002909517028352971634456212964043523117600665101241200659755851276178583829204197484423608007193045761893234922927965019875187212726750798125547095890455635792122103334669749923563025494780249011419521238281530911407907386025152274299581807247162591668545133312394804947079119153267343028244186041426363954800044800267049624820179289647669758318327131425170296923488962766844032326092752496035799646925650493681836090032380929345958897069536534940603402166544375589004563288225054525564056448246515187547119621844396582533754388569094113031509526179378002974120766514793942590298969594699556576121865619673378623625612521632086286922210327488921865436480229678070576561514463204692790682120738837781423356282360896320806822246801224826117718589638140918390367367222088832151375560037279839400415297002878307667094447456013455641725437090697939612257142989467154357846878861444581231459357198492252847160504922124247014121478057345510500801908699603302763478708108175450119307141223390866393833952942578690507643100638351983438934159613185434754649556978103829309716465143840700707360411237359984345225161050702705623526601276484830840761183013052793205427462865403603674532865105706587488225698157936789766974220575059683440869735020141020672358502007245225632651341055924019027421624843914035998953539459094407046912091409387001264560016237428802109276457931065792295524988727584610126483699989225695968815920560010165525637568
e ≈ 2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427
从算法可以知道,长数×短数效率比 短数×长数 高,因为前者能减少大整数相加的次数
e×π运行结果截图:
耗时约110秒
π×e运行结果截图:
耗时约1秒
结果数值:
8.53973422267356706546355086954657449503488853576511
49618796011301792286111573308075725638697104739425708496659615613913909031882891
63304874702931206948043164108389947986801346458016320607950949370904504791829301
89641127993590408447951152748176780165793597309698074446486521669856777221553068
56702812145756434465053396967135023477131383418087191950416828003023795517129169
12072692031797106921206190314994479665012339566329074184947417514767577529479893
26078194542286725502443547116211727230649803247362995273485170110776330324263050
12054270724025429948218427158651077441469090833875579038362688148730065106716898
67286661852100217581350493897110905745772160594211101144801336839631728031302376
56207834051823520388588863610321598168462598975655006201282140587586559870929119
25273898609933934480260198470479806817049538879858552756883834559931291952861185
92447456980991418661359275818109339236800193328839413254743120242272207106206188
19182104187328476031776327720559113148650451789227351485550830788999050036527896
77116514386100590769648329649607509432114820881274449766772928160948624660429207
86042024682154180235353092779169827247912727169177129870995518649725511200558294
64109412335776310946614484072913070318753021894185607796354117343895641031742628
66949157242006732706693630865361513857384663723328537265321018260257182137322423
74086071531228541986082485412080790600827261365975455183743148412606753481715760
19030842011100750180495957142899184781962985880206969123261875468160043199816906
28530246807079910748879735167498889152768882101408292738399809578923688124511878
94681304840512263122183638774426844843249056598377385030911493666743564544623674
57317121707305951066931176756101818564752301112023172043119170097207448958165539
13061849315837306247108268940468850490121747565932165728972888770967020564012426
02245613835823560553625931129532898734061035862829683979845093474647887231562766
79188748395986863573801569267794438201603101863215322586496051455122354771989626
08345461882603661644366002048377591526988082562712943829276075272724884134892454
32665174094930981914113327539389114534341160442554965888705391490185527907519385
69788698583106030155551163526135500500696036954159519557461004323058093102576802
56330959615295882060843355869528918806645445048355367991590163721562552083941396
89351032911491511900164020611356711058827454832982660269400140375771079402191932
09851376207543917615378575255020297152099168195858083985555980748212069663785356
67657382746542973672681519406852915554049230268656974112353723537628949427325363
42638362557082208592588085282549302665181026814884602394265817680189223669494714
44926305080416648067844438468221202363099543765790979148315767880566462500373125
81563274927340989649996707736210546110423167412865028523636811255228413757904232
56790200864232097843438491545553867438647754141067279348730525109997263086945917
78408084373664265625417463368783363496007734908002857161839634805815854248088956
45950848167315017213675681980725244174166866511355669687063453765373087156135225
07257400436216538296147274150896896499066485299995586891245449711788634956406766
62263361646288655956498628401622428655081497640822889714100450749055307158264442
46909051205469866137900196165968607006326257707541601282861081490980701565412283
20372565206658398082381269249989808460401120447086224688344102533401192466690732
60557292539235953279942428247245640220027836490145191725731928557582129647726667
09646453186872558931629908374265023975348832865024499801179021800370678824916776
20486021986811567132886080763691869889960899690328459629283036488434371364352397
27991110343530139130970045172342288808867248554362336678808486709475921043809454
05167527591060244880476009899046734408174168073709072723075700206849652168844131
87551273133818765624048532141802058677783297892179513276387560735320324315718691
81488490691216194606736338410421353383943044073389164147299413120926268549591558
28847494737746517770076344528204148573237150851605338193317974246329025293122018
79688584206266129904067218388138678816505449461430860366513226595796224173093326
72801581287176438229152284059125937224752135490679562445448169384913270601386257
64300277534643496059390892575897311598250993747505234457943502088133752758114814
35713022720303082747360094925342569837627413666188671490650145045818356461506412
83920580257534445782920443950270780253385658568637132963342073903180581075414526
16995647924017919121403173261791391238075714513866692649749449508793308152250710
48092781465663648670140374798508390771903367064026881341185885054217036072872214
55869797070981423655294053939088426724046463943132934538055557600787198706887248
20294583978079621479537500047595633315977844722817830986516268311675520663625576
10097060692788544195045713805306563236837643183576245533629034128009335717390561
56148779418635448673184488880109407845758954427980208759246395732060448572963779
56914266589167487761498230783398750074547694748776182814038446450733986110322700
40286967198089834641887929842169678670432667624163062245809146634627366557023329
36330769818027711068715170858934765116660564226595575259680040765746530300494332
56345314391370185315835109096354341395063467902351050782035926370466254044726100
53101137408247034640903632405196705911946544424525340452739331011326150903334409
21646139001729209509948415795353281107969274472685741300929461765666837179388129
74682406800347129821542409721327823411837117172582508678366567710291166880153914
04198160819925350299728272666031148637621801626144929163651042107904597604022816
76635070007009834662932076321239620419999916030598602548044512562764280310503907
12697329236013823002150134717405178444661536205060836666700747162728120479142042
40061902052107488304439694567710401308953324201446054454103423585875433825791400
15182366273472199840371773509630889329551011077256878938578776512671582173180781
77619075753764460046152087607774240241854731656102861544239426794787251062349514
11366775242436526136979595437328146188267455892883858267818311126024344171301684
57604240284985328082732273949120327533071110147947966904083969955632559080803008
15187031319659613977017354476547360437076208537429387451404964003792344122085698
74780347657417625169063482849704635679423361370389491833667738054314530422350187
50708663169997206393783651243008939901635837745651471251970103213478577925365843
42029120365628420733968753584122713078786045383326386757360841436348763560854941
33108998921669896260046985036903055936057753967147007121687302308889038268745504
09381085837070636100656943940035884591960402238635672609121420087278926605479587
25593692149094846883595023406655836862176211409176193254058270964092313186443437
77996636002506765845246544256577189471252775813457130255085214380889153407758615
31743241761361230859242402000638099431277427395696452244233236117324840327378746
24029439937174472570355699484278178979937990545779059607407914008107182237869300
79473988428015503249997393326057889954201322978287640133847283639855831999307193
87612838170526392390917101273678485474443361710661896463649701522488796012041663
62525082826083617959732200096264440932494140058276227217726841768206351803321890
15551649154914635449513299224603834105862542766006288635473766825757546705465109
97352638220582156871577002989510230407332989278181715316366408541254175730520672
69053078334966021099866106868625069313393268142849821090827189418019025492674202
32461461847460383643687710027517073139651670020432005267270525417958241551045960
87319730285368655340418892337088716536725671703414714570998846309310643787954319
93434371504337707516936167929417629728474162192723162828101925166783815313516711
09866903385361321235170844556862646686230805374808611663275567061023196909272162
99067519235094040345954812263616973942876165012935255622930564797514472990601434
62156602314127356078905106560278892115305091910473544742007629387554636230650951
55067729776380883455248238217655535467402686289924130782352369961149842955100196
97627893839456627499558848315101221259126738064938299747996444590699151038859490
26535683324002025746498372183090982823792908748702398675745365293786930684771467
80868530069646956645483996157813992601220307952187540198134187629371628163861712
51916874566070168832791746141289694641172812420061467169777382158532387290329100
51418399762526709699204642729225917561077448900170925042179228666410034657556646
29824786339111046157641091746876443097586221927205783474229049669693793010633603
80240834143165931301967877970359691195468154461643773842314431522107632790292663
67686478306762946171411409298189217547828094862323801311461418118079765172250403
08210018103802330017066315256034852786745156728441545618909444372669715767384438
70857963817071788001887734262537833455558745394252945942917035681402009091011221
61590266783847594891851219319155060565066938992634304945783099289623785660694858
60351893990749223443781746815466595946644517347379916059492785673069591686304883
85217883936173616891016610396542323558139681822078994379494584772615439581345705
95082708292638624011972080179026607195952777235676190310548163620450967546242487
84920618572552345762555860824996872880744591545023062675665190739787182227263326
56958243469325947968706005995620793949430275574903266597508491900185606083932690
25841557978127033837230422806825490815814526092300007695606154487335540370869270
88700369242717276258717973117471074105443430278940896681024885078498097123023715
76587387643029625710033881817556911147870965629787995015191007354874646535044184
70912510594758582860527723791506539461826100367057411847608554240832284334327895
42503626942498882171937338416021050744348581133279692580665017403138222000783827
52925547111108676365486665869771001687813412008512176322087207557075438317004014
64466801553891166690167120805780237578018071766221350151908597906047460549439754
72040982148778070996447147265988093027266932534082426615504188561714061185213222
71154449380786061177662854566227139875236167923151897306010811736675986275752001
93626736072010443045767719340464145631245641555886062569916916118502255774781275
80076156858525330238121365015615173139976215235327848399714750770630863508633725
057446753149495151695983807078155240762483529536