昨晚有人问数值相乘不溢出的问题,
于是突发奇想,
想做个任意数乘以任意数的程序。
刚打完调试好的代码,没有注释有空再补上吧:
/**********************************
主函数 main.cpp
**********************************/
#include"HeadFile.h"
extern void Print(int *a,int n);
extern int Create(int *&a,int &n);
extern void Multiply(int *&a,int &n,int *b,int m);
void Achieve();
void main()
{
int t=1;
while(t!=0)
{
Achieve();
printf("/n:::::::::::::::::::::::::::::::::::::::::::::::::/n/n");
printf("/n/t输入0退出,非0继续:");
scanf("%d",&t);
fflush(stdin);
printf("/n/n:::::::::::::::::::::::::::::::::::::::::::::::::/n");
}
}
void Achieve()
{
int *p,*q;
int n=1,m=1;
printf("/n:::连按两次 enter键 求值:::/n/n/t输入乘数 :/n/n");
p=(int *)malloc(sizeof(int));
printf("/t/t|/t");
if(Create(p,n))
{
q=(int *)malloc(sizeof(int));
printf("/t/t|/t");
while(Create(q,m))
{
Multiply(p,n,q,m);
free(q);
m=1;
q=(int *)malloc(sizeof(int));
printf("/t/t|/t");
}
free(q);
printf("----------------|----------------/n/n/t=/t/t");
Print(p,n);
}
free(p);
printf("/n/n/n");
}
/**********************************
输入函数 Create.cpp
**********************************/
#include"HeadFile.h"
extern int Endif(char ch);
extern void Test(char ch);
int Create(int *&a,int &n)//输入一个任意数
{
int *tem;
int t,i;
char ch;
tem=(int *)malloc(sizeof(int));
fflush(stdin);
ch=getchar();
t=Endif(ch);
if(t)
{
do{
Test(ch);
tem[n-1]=(int)(ch-48);
tem=(int *)realloc(tem,++n*sizeof(int));
if(!tem) exit(-1);
ch=getchar();
}while(ch!='/n');
n--;
a=(int *)realloc(a,n*sizeof(int));
for(i=n-1;i>=0;i--)
a[i]=tem[n-1-i];
}
free(tem);
return t;
}
/**********************************
求积函数 Multiply.cpp
**********************************/
#include"HeadFile.h"
void Multiply(int *&a,int &n,int *b,int m)
{
int i,j;
int carry,carryma; //进位数
int lenma,lenpa=1; //记录数长
int *pa,*ma;
pa=(int *)malloc(sizeof(int));
pa[lenpa-1]=0;
for(j=0;j<m;j++)
{
carry=0;
carryma=0;
lenma=n+j;
ma=(int *)malloc(lenma*sizeof(int));
if(!ma) exit(-1);
for(i=0;i<lenma;i++) ma[i]=0;
for(i=0;i<n;i++)
{
ma[i+j]=carry+a[i]*b[j];
carry=ma[i+j]/10;
ma[i+j]=ma[i+j]%10;
}
if(carry>0)
{
ma=(int *)realloc(ma,++lenma*sizeof(int));
if(!ma) exit(-1);
ma[lenma-1]=carry;
}
pa=(int *)realloc(pa,lenma*sizeof(int));
if(!pa) exit(-1);
for(i=lenpa;i<lenma;i++) pa[i]=0;
lenpa=lenma;
for(i=0;i<lenma;i++)
{
pa[i]+=carryma+ma[i];
carryma=pa[i]/10;
pa[i]=pa[i]%10;
}
if(carryma>0)
{
pa=(int *)realloc(pa,++lenpa*sizeof(int));
if(!pa) exit(-1);
pa[lenpa-1]=carryma;
}
free(ma);
}
free(a);
a=pa;
n=lenpa;
return;
}
/**********************************
Endif.cpp
**********************************/
#include"HeadFile.h"
int Endif(char ch)//判断是否结束输入
{
if(ch=='/n') return 0;
else return 1;
}
/**********************************
Test.cpp
**********************************/
#include"HeadFile.h"
void Test(char ch)//检测输入的数值为0--9间
{
if(ch<48||ch>57)
{
printf("/n输入错误,结束程序/n/n/n");
exit(-1);
}
return;
}
/**********************************
输出函数 Print.cpp
**********************************/
#include"HeadFile.h"
void Print(int *a,int n)
{
int i;
for(i=n-1;i>=0;i--)
printf("%d",a[i]);
return;
}