本人C语言小白一枚,有不对的地方还请多指教
#include "stdio.h"
#include "string.h"
#define N 1000//便于后期处理
void HighPlus(char x1[],char x2[]);
void HighMinus(char x1[],char x2[]);
void HighMultiply(char x1[],char x2[]);
void Output(int a[],int n);
int compare(char a[],char b[]);
int main()
{
char x1[N],x2[N];
gets(x1);//保证读入的数字可以为高精度
gets(x2);
HighPlus(x1,x2); //加
HighMinus(x1,x2); //减
HighMultiply(x1,x2);//乘
return 0;
}
void HighPlus(char x1[],char x2[])
{
int i,j,n,n1=strlen(x1),n2=strlen(x2);
int a[N]={0},b[N]={0};
for(i=n1-1,j=0;i>=0;i--)
a[j++]=x1[i]-'0'; //字符转整数
for(i=n2-1,j=0;i>=0;i--)
b[j++]=x2[i]-'0'; //字符转整数
if(n1>n2)
n=n1;
else //取高位数
n=n2;
for(i=0;n>i;i++)
{
a[i]+=b[i];
a[i+1]+=a[i]/10; //按位做加法
a[i]=a[i]%10;
}
if(a[n]!=0)
n=n+1; //如果最高位进位,位数加一
Output(a,n);
}
void HighMinus(char x1[],char x2[])
{
int i,j=0,n,n1=strlen(x1),n2=strlen(x2);
int a[N]={0},b[N]={0};
for(i=n1-1,j=0;i>=0;i--)
a[j++]=x1[i]-'0'; //字符转整数
for(i=n2-1,j=0;i>=0;i--)
b[j++]=x2[i]-'0'; //字符转整数
if(compare(x1,x2)==1) //判断谁大谁小
{
n=n1;
for(i=0;n>i;i++)
{
a[i]-=b[i];
if(a[i]<0) //按位做减法
a[i]+=10,a[i+1]--;
}
while(a[n-1]==0) //去首位0
n=n-1;
Output(a,n);
}
else
{
n=n2;
for(i=0;n>i;i++)
{
b[i]-=a[i];
if(b[i]<0) //a换为b即可
b[i]+=10,b[i+1]--;
}
printf("-");
while(b[n-1]==0)
n=n-1;
Output(b,n);
}
}
void HighMultiply(char x1[],char x2[])
{
int i,j=0,n,n1=strlen(x1),n2=strlen(x2);
int a[N]={0},b[N]={0},c[1000]={0};
for(i=n1,j=1;i>=1;i--)
a[j++]=x1[i-1]-'0'; //字符转整数
for(i=n2,j=1;i>0;i--)
b[j++]=x2[i-1]-'0'; //字符转整数
for(i=1;n1>=i;i++)
{
for(j=1;n2>=j;j++)
{
c[i+j-1]+=a[i]*b[j]; //按位乘,同时错位相加
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
n=i+j;
while(c[n]==0&&n>1)
n--; //除首位0
for(i=n;i>=1;i--)
{
printf("%d",c[i]);
}
}
void Output(int a[],int n)
{
int i;
for(i=n-1;i>=0;i--)
printf("%d",a[i]);
}
int compare(char a[],char b[])
{
if(strlen(a)>strlen(b))
return 1;
if(strlen(a)<strlen(b))
return 0;
if(strcmp(a,b)>0)
return 1;
return 0;
}
感谢围观,如果有用的话点个赞再走吧