主题:[原创]极大数的乘方
/*用数组存储数字,可以超越数据类型的限制,实现极大数的乘方 */
/*2005-3-8 梁见斌*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 1000
void NiZhi(int *ShuZu, int len);/*把数字逆置,把个位数字存储在a[0]*/
void ZhuanHuan(char *ZhiFu, int *ShuZi, int len);/*把字符改存为整型数字*/
int main(void)
{/*a[max]和b[max]存放被乘数,aa[max]存放乘数,c[max]存放积*/
int a[max]={0}, b[max]={0}, c[max]={0}, aa[max]={0};
int *r, *s;
char e[30];/* e[30]和f[30]存放以字符串形式输入的乘数和被乘数*/
char *p;
int i, j, k;
int x, jinwei, d;
int len1, len2;
unsigned n, num=1;
r=a;
p=e;
puts("Inter m:");
scanf("%s", p);
puts("Inter n:");
scanf("%lu", &n);
len1=strlen(e);
ZhuanHuan(p, r, len1);
NiZhi(r, len1);
for(j=0; j<=len1; j++)/*每次都用aa[ ]表示乘数*/
aa[j]=a[j];
len2=len1; /*len2表示当前被乘数,即m的num次方的位数*/
do{
for(i=0; i<len1; i++)
{
for(j=0; j<=len2; j++)/*每次都使 b[ ]表示当前被乘数,即m的num次方*/
b[j]=a[j];
d=10;/*提供足够多的存储空间以存放积的进位,此处设为20,可根据数据的大小调节*/
jinwei=0;
for(j=0; j<=len2+d; j++)/*用乘数的每一位从个位开始依次和被乘数相乘,用b[ ]存储当前积*/
{
x=b[j]*aa[i]+jinwei;/*用 aa[ ]表示乘数*/
jinwei=x/10;
b[j]=x%10;
}
while(a[j] == 0)/*用j表示现有数字的个数,多出的存储空间应消除*/
j--;
d=4;/*提供足够多的存储空间以存放积的进位,此处设为4,可根据数据的大小调节*/
jinwei=0;
for(k=0; k<=j+d; k++)/*c[max]存放原始积,注意每次把当前积与原始积时相加时两者的位置对应情况*/
{
x=b[k]+c[k+i]+jinwei;
jinwei=x/10;
c[k+i]=x%10;
}
}
k=k+i; /*用k表示现有数字的个数,多出的存储空间应消除*/
while(c[k] == 0)
k--;
len2=k; /*len2表示当前被乘数,即m的num次方的位数*/
for(j=0; j<=len2; j++)/*每次都使 a[j]=c[j]*/
a[j]=c[j];
for(j=0; j<=len2; j++)/*每次都使 c[ ]初值为0*/
c[j]=0;
num++;/*累积乘方的次数*/
} while(num < n);
printf("\n%s ( %lu )=\n", p, n);
for(i=len2; i>=0; i--)
printf("%d",a[i]);
system("pause");
return 0;
}
void NiZhi(int *ShuZu, int len)
{
int i, t;
for(i=0; i<len/2; i++)
{
t=*(ShuZu+i);
*(ShuZu+i)=*(ShuZu+len-i-1);
*(ShuZu+len-i-1)=t;
}
}
void ZhuanHuan(char *ZhiFu, int *ShuZi, int len)
{
int i;
for(i=0; i<=len-1; i++)
*(ShuZi+i)=int(*(ZhiFu+i))-48;
}
/*2005-3-8 梁见斌*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 1000
void NiZhi(int *ShuZu, int len);/*把数字逆置,把个位数字存储在a[0]*/
void ZhuanHuan(char *ZhiFu, int *ShuZi, int len);/*把字符改存为整型数字*/
int main(void)
{/*a[max]和b[max]存放被乘数,aa[max]存放乘数,c[max]存放积*/
int a[max]={0}, b[max]={0}, c[max]={0}, aa[max]={0};
int *r, *s;
char e[30];/* e[30]和f[30]存放以字符串形式输入的乘数和被乘数*/
char *p;
int i, j, k;
int x, jinwei, d;
int len1, len2;
unsigned n, num=1;
r=a;
p=e;
puts("Inter m:");
scanf("%s", p);
puts("Inter n:");
scanf("%lu", &n);
len1=strlen(e);
ZhuanHuan(p, r, len1);
NiZhi(r, len1);
for(j=0; j<=len1; j++)/*每次都用aa[ ]表示乘数*/
aa[j]=a[j];
len2=len1; /*len2表示当前被乘数,即m的num次方的位数*/
do{
for(i=0; i<len1; i++)
{
for(j=0; j<=len2; j++)/*每次都使 b[ ]表示当前被乘数,即m的num次方*/
b[j]=a[j];
d=10;/*提供足够多的存储空间以存放积的进位,此处设为20,可根据数据的大小调节*/
jinwei=0;
for(j=0; j<=len2+d; j++)/*用乘数的每一位从个位开始依次和被乘数相乘,用b[ ]存储当前积*/
{
x=b[j]*aa[i]+jinwei;/*用 aa[ ]表示乘数*/
jinwei=x/10;
b[j]=x%10;
}
while(a[j] == 0)/*用j表示现有数字的个数,多出的存储空间应消除*/
j--;
d=4;/*提供足够多的存储空间以存放积的进位,此处设为4,可根据数据的大小调节*/
jinwei=0;
for(k=0; k<=j+d; k++)/*c[max]存放原始积,注意每次把当前积与原始积时相加时两者的位置对应情况*/
{
x=b[k]+c[k+i]+jinwei;
jinwei=x/10;
c[k+i]=x%10;
}
}
k=k+i; /*用k表示现有数字的个数,多出的存储空间应消除*/
while(c[k] == 0)
k--;
len2=k; /*len2表示当前被乘数,即m的num次方的位数*/
for(j=0; j<=len2; j++)/*每次都使 a[j]=c[j]*/
a[j]=c[j];
for(j=0; j<=len2; j++)/*每次都使 c[ ]初值为0*/
c[j]=0;
num++;/*累积乘方的次数*/
} while(num < n);
printf("\n%s ( %lu )=\n", p, n);
for(i=len2; i>=0; i--)
printf("%d",a[i]);
system("pause");
return 0;
}
void NiZhi(int *ShuZu, int len)
{
int i, t;
for(i=0; i<len/2; i++)
{
t=*(ShuZu+i);
*(ShuZu+i)=*(ShuZu+len-i-1);
*(ShuZu+len-i-1)=t;
}
}
void ZhuanHuan(char *ZhiFu, int *ShuZi, int len)
{
int i;
for(i=0; i<=len-1; i++)
*(ShuZi+i)=int(*(ZhiFu+i))-48;
}