Thursday, January 12, 2012

Write a program to calculate N^N



#include<stdio.h>
#include<math.h>
#include<string.h>
#define MAX 50005

long num1[MAX] , mul;

void strexp(long pow);
void assign(long k , long *p);
void squaremulti(long num2[]);

int main()
{
long pow , flag ,i;

while(scanf("%ld" , &pow)==1)
{
mul = pow;
for(i = 0;i<MAX;i++) num1[i] = 0;

assign(pow , num1);
strexp(pow); flag = 0;

for(i = MAX-1;i>=0;i--)
{
if(flag==1) printf("%ld" , num1[i]);
if(num1[i]==-1) flag = 1;
}
printf("\n");
}
return 0;
}

void squaremulti(long num2[])
{
long num3[MAX] = {0};
long i ,j ,k ,rem ,a ,b;

for(i = 0;num2[i]!=-1;i++)
{
k =i; rem = 0;
for(j = 0;num1[j]!=-1;j++)
{
b = num3[k];
if(num3[k] == -1)
b = 0;
a = b+num2[i]*num1[j]+rem;
num3[k] = a%10;
k+=1;
rem = a/10;
}
if(rem>0)
{
num3[k] = rem;
k+=1;
}
num3[k] = -1;
}
for(i = 0; ; i++)
{
num1[i] = num3[i];
if(num3[i]==-1)
break;
}
}

void strexp(long pow)
{
if(pow == 0)
return ;
else if(pow%2==0)
{
strexp(pow/2);
squaremulti(num1);
}
else
{
strexp(pow-1);
if(pow-1==0)
return ;
long num2[10];
assign(mul , num2);
squaremulti(num2);
}
}
//convert long int number in the char array
void assign(long k , long *p)
{
long i = 0;
while(k!=0)
{
p[i] = k%10;
k/=10;
i++;
}
p[i] = -1;
}
/*
Input:
2 3 4 5 6 7
Output:
4 27 256 3125 46656 823543*/

No comments:

Post a Comment