PDA

View Full Version : آموزش: اموزش به دست اوردن توان های بزرگ



motherboard
یک شنبه 27 بهمن 1392, 17:13 عصر
سلام خدمت همگی.کد زیر برنامه ای است که به عنوان مثال 2 به توان 1000 رو به دست می اورد.البته از اعداد دیگر هم میتونید استفاده کنید.از عیب های این برنامه سرعت کم در اجرای توان های خیلی خیلی بزرگ میباشد.:گیج:


#include <conio.h>
#include <math.h>
#include <iostream>
#include <string>

using namespace std;

//
void Tipper (string & Num)
{
int i;
char ch;

for( i=0; i< ( int(Num.size()/2)); i++)
{
ch = Num.at(i);
Num.at(i) = Num.at( ( Num.size()- 1)-i);
Num.at( ( Num.size()- 1)-i) = ch;
}
}
//

// Sum for heavy number
string sum ( string Num1 , string Num2)
{
int i;
int MaxLen;
int sum=0;
int r=0;
char ch;
string Num3;

Tipper(Num1);
Tipper(Num2);

if(Num1.size() < Num2.size())
{
MaxLen=Num2.size();
}
else
{
MaxLen=Num1.size();
}

for( i=0; i<MaxLen; i++)
{
sum=0;
if( i< int(Num1.size()))
{
sum += Num1.at(i)-48;
}
if( i< int(Num2.size()))
{
sum += Num2.at(i)-48;
}

ch = ( (sum+r) % 10) + 48;
Num3.push_back(ch);

r = (sum+r) / 10;
}

if(r != 0)
{
ch = r + 48;
Num3.push_back(ch);
}

Tipper(Num3);
return Num3;
}
// End of Sum for heavy number

//Multiplication for heavy number
string multiplication ( string Num1 , string Num2)
{
int i;
int j;
int t;
int r = 0;
int mult=0;
char ch;
string Num3;
string Sum = "0";

Tipper(Num1);
Tipper(Num2);

if( Num1.size() > Num1.size())
{
Num1.swap(Num2);
}

for ( i = 0; i < int(Num1.size()); i++)
{
r=0;

for ( t = 0; t < i; t++)
{
Num3.push_back( '0');
}

for ( j = 0; j < int(Num2.size()); j++)
{
mult = ( Num1.at(i)-48) * ( Num2.at(j)-48);
ch = ( ( mult + r) % 10) + 48;
Num3.push_back( ch);
r = ( mult + r) / 10;
}

if( r != 0)
{
ch = r + 48;
Num3.push_back( ch);
}

Tipper(Num3);

Sum = sum( Sum, Num3);

Num3.clear();
}

return Sum;
}
//end Multiplication for heavy number

//Power for heavy number
string power( string Num1, int Num2)
{
int i;
string result = "1";

for( i=0; i<Num2; i++)
{
result = multiplication(result,Num1);
}

return result;
}
//end Power for heavy number

int main()
{
cout<<power("2",1000)<<endl;
getch();
return 0;
}

hadi0x7c7
یک شنبه 27 بهمن 1392, 20:10 عصر
شما میتونید توان رسوندن رو از مرتبه n به lgn برسونید اگه توان های زوج رو به صورت ضرب توان n/2 در خودش و توانای فرد هم به صورت n-1 تقسم بر دو ضرب در خودش و در نهایت ضرب در یک a اضافه بکنید.

http://en.wikipedia.org/wiki/Exponentiation_by_squaring