PDA

View Full Version : ضرب دو عدد20 رقمی



سایان گستر
سه شنبه 11 اردیبهشت 1386, 22:59 عصر
با سلام اگه میشه در موردبرنامه ی ضرب دو عدد20رقمی به زبان Cراهنمایی کنید

mehrzad007
چهارشنبه 12 اردیبهشت 1386, 12:54 عصر
من یه برنامه ضرب ده رقم در ده رقم نوشتم توی سایت هست . بگردی پیداش می کنی . سادس می تونی راحت تبدیلش کنی به بیست رقم . البته به نظرم با وی بی باشه. یادم نیست.

RED-C0DE
شنبه 15 اردیبهشت 1386, 21:55 عصر
این برنامه به زبان ++C می تونه دو عدد با چندین هزار رقم رو در هم ضرب کنه! :

برنامه دو تا عدد رو بصورت رشته ای می گیره (با فاصله از هم باید جدا باشن) و به همون صورتی که یکنفر یک ضرب معمولی رو روی کاغذ انجام می ده عمل می کنه. البته راه حل بهینه تری هم داره که من بلد نیستم. بعد از وارد کردن دو عدد در خروجی جواب رو چاپ می کنه و برنامه زمانی که در ورودی مقدار 0 0 وارد بشه تمام می شه.

اگه سوالی داشتی بپرس.




#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

string s1,s2;
vector<string> vecRow;
string sRow;
string sN1;
string sN2;
string sSum;
int carry;

char ToChar(int n)
{
return n+'0';
}

int ToNum(char ch)
{
return ch-'0';
}

int main()
{
while(cin >>s1 >> s2 && s1!="0" || s2!="0")
{
sSum.clear();
vecRow.clear();
sN1.clear();
sN2.clear();

unsigned sz1=s1.size();
unsigned sz2=s2.size();

for(int i2=sz2-1; i2>=0; i2--)
{
sRow.clear();
carry=0;
for(unsigned z=1; z<sz2 - i2; z++) // Adding 0
sRow.push_back('0');

for(int i1=sz1-1; i1>=0; i1--)
{
int mul = ToNum(s2[i2]) * ToNum(s1[i1]) + carry;
carry = mul/10; // calcuate Carry
sRow.push_back(ToChar(mul%10));
}
if(carry) // adding Carry
sRow.push_back(ToChar(carry));
vecRow.push_back(sRow);
}


// Calcuate summary of Rows :
unsigned sz= vecRow.size();
unsigned i1=0 , i2=0;
sSum = vecRow[0];

if(sz>=2)
{
for(unsigned i=1; i<sz; i++)
{
sN1 = sSum;
sN2 = vecRow[i];
sSum.clear();
carry=0;

unsigned sz1 = sN1.size();
unsigned sz2 = sN2.size();
for(i1=0 , i2=0; i1<sz1 && i2<sz2; i1++ , i2++ )
{
int sum = ToNum(sN1[i1]) + ToNum(sN2[i2]) + carry;
carry = sum/10;
sSum.push_back(ToChar(sum%10));
}
// Adding everything that is remained :
if(carry && i1==sz1 && i2==sz2)
sSum.push_back('1');
while(i1<sz1)
{
if(carry)
sSum.push_back(ToChar(ToNum(sN1[i1++]) + carry));
else
sSum.push_back(sN1[i1++]);
carry =0;
}
while(i2<sz2)
{
if(carry)
sSum.push_back(ToChar(ToNum(sN2[i2++]) + carry));
else
sSum.push_back(sN2[i2++]);
carry =0;
}
}
}

// print :
sz=sSum.size();
for(int i=sz-1; i>=0; i--)
cout << sSum[i] ;

cout << endl;
}

return 0;
}