大数四则运算(C语言)

完全按照自己的想法做的,所以不太成熟,希望有兴趣的朋友提出意见!

 

 

#include<stdio.h>
#
include<string.h>

//最大数长度

#
define MAX 200

//读入输入的大整数,a[0]存储大整数的长度

void read(int *a)
{
    unsigned int i
,len;
    char s[
MAX];
    scanf(
"%s",&s);
    a[
0= strlen(s);
    
    
for(i=0; i<a[0]; i++)
    {
        
if(s[i]>='0' && s[i]<='9')
            a[a[
0]-i] = s[i]-'0';
        
else
        {
            
printf("输入出错!");
            
exit(0);
        }
    }
}

//加法
void add(int *a, int *b, int *c)
 {
    int k 
= 0, i, max_len;
    max_len 
= a[0];
    
if(b[0> max_len)
        max_len 
= b[0];
    
for(i=0; i<max_len; i++)
    {
        k 
= k + a[i+1+ b[i+1];
        c[i
+1= k%10;
        k 
= k/10;
    }
    
if(k != 0)
    {
        c[i
+1= k;
        c[
0= i+1;
        
for(; i<MAX-2; i++)
            c[i
+2= 0;
    }
    
else
    {
        c[
0= i;
        
for(; i<MAX-1; i++)
            c[i
+1= 0;
    }
}

//比较两个数组表示的整数的大小,a>b返回1,否则返回0
int compare(int *a, int *b)
{
    int i;
    
if(a[0> b[0])
        
return 1;
    
else if(a[0== b[0])
    {
        
for(i=0; i<a[0]; i++)
        {
            
if(a[a[0]-i] > b[b[0]-i])
                
return 1;
        }
        
return 2;
    }
    
else 
        
return 0;
}

//减法
void subABigerB(int *a, int *b, int *c)
{
    int i;
    
for(i=1; i<a[0]+1; i++)
    {
        
if(a[i] >= b[i])
        {
            
//k = 0;
            c[i] = a[i] - b[i];
        }
        
else
        {
            
//k = 1;
            while(a[i+1== 0)
                i
++;
            
            a[i
+1]--;
            c[i] 
= a[i] + 10 - b[i];
        }
    }
    c[
0= a[0];
}


//减法
void sub(int *a, int *b, int *c)
{
    int i;
    
for(i=0; i<MAX; i++)
    {
        c[i] 
= 0;
    }
    
if(compare(a, b) == 1)
    {
        subABigerB(a
, b, c);
        
        
//打印
        printf("Difference: ");
        i 
= c[0];
        
while(c[i] == 0)
            i
--;
        
for(; i>0; i--)
        {
            
printf("%d",c[i]);
        }
        
printf(" ");
    }
    
else if(compare(a, b) == 0)
    {
        subABigerB(b
, a, c);
        
        
//打印
        printf("Difference: ");
        i 
= c[0];
        
while(c[i] == 0)
            i
--;
        
printf("-");
        
for(; i>0; i--)
        {
            
printf("%d",c[i]);
        }
        
printf(" ");
    }
    
else
        
//打印
        printf("Difference: 0 ");
}

//数组与单个整数的乘法
void singleMul(int *a, int m, int *c)
{
    int k 
= 0, i;
    
    
for(i=0; i<a[0]; i++)
    {
        k 
= k + a[i+1* m;
        c[i
+1= k%10;
        k 
= k/10
    }
    
    
if(k != 0)
    {
        c[i
+1= k;
        c[
0= i+1;
    }
    
else
        c[
0= i;
}

//整数数组之间的乘法
void mul(int *a, int *b)
{
    int k 
= 0, i, c[MAX], d[MAX], e[MAX], max_len;
    int f 
= 0, j;
    
    memset(c
,0,sizeof(c));
    memset(d
,0,sizeof(d));
    memset(e
,0,sizeof(e));
    max_len 
= a[0];
    
if(b[0> max_len)
        max_len 
= b[0];
    
    
//d = singleMul(a, b[1]);
    for(i=0; i<b[0]; i++)
    {
        singleMul(a
, b[i+1], c);
        
if(i-1>=0)
            d[
0= d[0]-1;
            d[
1= d[0];
        add(
&d[1], c, d);
        e[i
+1= d[1];
    }
    
    
    
for(j=0; j<d[0]-1; i++,j++)
    {
        e[i
+1= d[2+j];
    }
    
    e[
0= i;
    
    
//打印
    for(i=e[0]; i>0; i--)
    {
        
printf("%d",e[i]);
    }
    
printf(" ");
}


int main()
{
    int a[
MAX],b[MAX],c[MAX],a_len,b_len,max_len;
    int i;
    
//清零
    memset(a,0,sizeof(a));
    memset(b
,0,sizeof(b));
    memset(c
,0,sizeof(c));
    read(a);
    read(b);
    
    
//加法
    add(a, b, c);
    
    
printf("Sum: ");
    
//打印
    for(i=c[0]; i>0; i--)
    {
        
printf("%d",c[i]);
    }
    
printf(" ");
    
    
//printf("%d",compare(a, b));
    
    //减法

    sub(a, b, c);
    
    
//乘法
    printf("Product: ");
    mul(a
, b);
    
//system("pause"); 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值