C语言 高精度运算(正整数)

在Visual C++ 2010 环境中
#include
#include//引入system(“pause”)语句
#include//引入字符串函数
void cout(int[]);//int[]输出
int compare(int[],int[]);//比较两int[]大小,>=return 1, void add(int[],int[],int*);//加法运算,最后的数组储存前两数组之和
int sub(int*,int[]);//减法运算,第一个数组储存前两数组之差,返回符号(1为正数,0为负数)
void mult(int[],int[],int*);//乘法运算,最后的数组储存前两数组之积
void move(int* num);//把num[]右移一位
void divi(int* num1,int num2[],int* num3);//乘法运算,mun1,mun3分别储存余数与商
int main()
{
char a[100],b[100],opera;
int num1[100]={0},num2[100]={0},num3[200]={0},num4[100]={0},i;
int sign;//用的编译器不支持bool,假装sign是bool,表示符号正负(1为+,0为-)
printf(“请输入两自然数,用回车分隔\n”);
gets(a);gets(b);
//确定两数字位数
num1[0]=strlen(a);
num2[0]=strlen(b);
//对a,b转换(注意char的偏移量与数字位数相反,使num的偏移量是其位数)
for(i=1;i<=num1[0];i++)
num1[i]=a[num1[0]-i]-‘0’;
for(i=1;i<=num2[0];i++)
num2[i]=b[num2[0]-i]-‘0’;
printf(“请输入进行的操作,支持+、-、、/\n");
opera=getchar();
switch(opera)
{
case ‘+’:
{add(num1,num2,num3);
printf("%s+%s=",a,b);
cout(num3);
break;}
case ‘-’:
{sign=sub(num1,num2);
printf("%s-%s=",a,b);
if(sign==0) printf("-");
cout(num1);
break;}
case '
’:
{mult(num1,num2,num3);
printf(”%s*%s=",a,b);
cout(num3);
break;}
case ‘/’:
{if(num2[0]==1&&num2[1]==0)
{
printf(“0不能做除数\n”);break;
}
divi(num1,num2,num3);
printf("%s/%s=",a,b);
cout(num3);
printf("…");
cout(num1);
break;}
}
system(“pause”);
return 0;
}
void cout(int num[])//输出函数
{
int i;
num[0]++;
for(;num[num[0]]0&&num[0]>1;–num[0]);
for(i=num[0];i>=1;i–)
printf("%d",num[i]);
printf("\n");
}
int compare(int num1[],int num2[])
{
int i;
for(i=num1[0]>num2[0]?num1[0]:num2[0];i>0;i–)
{
if(num1[i]>num2[i])return 1;
if(num1[i] }
return 1;
}
void add(int num1[],int num2[],int* num3)
{
int i;
//取得最大位数
num3[0]=num1[0]>num2[0]?num1[0]:num2[0];
//运算
for(i=1;i<=num3[0];i++)
{
num3[i]=num1[i]+num2[i]+num3[i];
num3[i+1]=num3[i]/10;//进位
num3[i]%=10;
}
}
int sub(int* num1,int num2[])
{
int sign,i,fig;
//取得差最大位数
fig=num1[0]>num2[0]?num1[0]:num2[0];
//1.确定结果符号
sign=compare(num1,num2);
//2.运算(大减小,不够就借位)
if(sign
1)
{
for(i=1;i<=fig;i++)
{
num1[i]-=num2[i];
if(num1[i]<0)//借位
{
num1[i+1]–;
num1[i]+=10;
}
}
}
else
{
for(i=1;i<=fig;i++)
{
num1[i]=num2[i]-num1[i];
if(num1[i]<0)//借位
{
num2[i+1]–;
num1[i]+=10;
}
}
}
return sign;
}
void mult(int num1[],int num2[],int* num3)
{
int i,n;
//取得积最大位数
num3[0]=num1[0]+num2[0];
//运算
for(i=1;i<=num1[0];i++)
{
for(n=1;n<=num2[0]; n++)
{
num3[i+n-1]+=num1[i]num2[n];
num3[i+n]+=num3[i+n-1]/10;//进位
num3[i+n-1]%=10;
}
}
}
void divi(int
num1,int num2[],int* num3)
{
int i,n,fig;//fig为除数左移位数
if(compare(num1,num2)==0)
num3[0]=1;
else
{
num3[0]=num1[0]-num2[0]+1;//取得商最大位数
fig=num3[0]-1;
for(i=num1[0];i>0;i–)//使被除数与商左对齐
if(i>=num3[0])
num2[i]=num2[i-fig];
else
num2[i]=0;
num2[0]=num1[0];
//确定商的每一位
for(i=num3[0];i>0;i–)
{
for(n=1;n<=10;n++)
{
if(compare(num1,num2)==1)
{
sub(num1,num2);
num3[i]++;
}
else
{
move(num2);
break;
}
}
}
}
}
void move(int* num)//把num[]右移一位
{
int i=1;
for(i=1;i<99;i++)
num[i]=num[i+1];
num[0]–;
}

你可能感兴趣的:(C语言 高精度运算(正整数))