大数的运算(加减乘除)C代码

  题目:一般数的加减乘除很好计算,如果超过了8为数,那么int就无能为力了。以前老是让做过大数的加法,但那时年少无知,没有去做,貌似当时的作业都没完成。这几天心血来潮,对着个问题有感兴趣。当然这是编程路上必须走的路。下面就献上我的代码。

分析:

       大数的运算,说大数,那就不能用简单的数据类型能解决的。我想到的是用数组存储数据。

       大概思路:说先义字符的形式把数输入到数组中,然后在将字符数组转换成整型的。然后对这些书进行操作。

比较大小:这个简单,把数组的每一位(从高到低)进行比较就行了。

 加法:将每一位进行相加,有进位的进行进位,后面相加时要加上进位。没有进位的直接就加起来。如果位数相等,直接相加就好了,如果位数不等,则把多余的部分直接放在结果中。
 加法:从最低位开始,将每以为相对的进行相减,如果见不过还要向前面借位。

除法和乘法还没做完,以后补上。

 代码不够简洁,有更好的代码的,可以拿来进行分享。

下面就是代码:

#define MAX 1000
#include<stdio.h>
void add(int *a,int *b,int nNuma,int nNumb);
void plus(int *a,int *b,int nNuma,int nNumb);
bool compare(int *a,int *b,int nNuma,int nNumb);
int main()
{
 int nNuma,nNumb;
 nNuma=0; nNumb=0;
 int i;
 char c1,c2;
 char a1[MAX],b1[MAX];
 int a[MAX],b[MAX];
 printf("请输入第一个数\n");
 for(i=0;;i++)
 {  
  nNuma++;
  scanf("%c",&c1);
  a1[i]=c1;
  if(c1=='\n')
  {  nNuma--;
	  break;
  }
 }
 printf("请输入第二个数\n");
 for(i=0;;i++)
 { 
  nNumb++;
  scanf("%c",&c2);
  b1[i]=c2;
  if(c2=='\n')
  {  nNumb--;
	  break;
  }
 }
 for(i=0;i<nNuma;i++)
 {
   a[i]=a1[i]-'0';
 }
 for(i=0;i<nNumb;i++)
 {
   b[i]=b1[i]-'0';
 }

 add(a,b,nNuma,nNumb);
 if(compare(a,b,nNuma,nNumb))
   printf("a>=b\n");
 else 
   printf("a<b\n");
 plus(a,b,nNuma,nNumb);
 return 0;

}
//大数减法
void plus(int *a,int *b,int nNuma,int nNumb)
{   int i,h; 
    int k=0;
	int c[MAX];
	//int ma[MAX];
    int na,nb;
	int *ma;
	int *mb;
	na=nNuma;
	nb=nNumb;
	ma=a;
	mb=b;
 if(!compare(a,b,nNuma,nNumb))
 { 
   ma=b;
   mb=a;
   na=nNumb;
   nb=nNuma;
 }
  
 for(;nb-1>=0;na--,nb--) 
 {
	 if(ma[na-1]<mb[nb-1])
	 {
	   ma[na-2]--;
	    h=10;
	 }
	 else 
		h=0;
	 
	 c[k]=ma[na-1]-mb[nb-1]+h;   //h为借位
	 k++;
 } 
 if(ma[na-1]<mb[nb-1])
 {
   ma[na-2]--;
   h=10;
 }
  else 
    h=0;
 if(na-1>=0)
 {
     for(i=nb-1;i>=0;k++,i--)
	   c[k]=ma[i];
 }
 printf("差为:  ");
 if(!compare(a,b,nNuma,nNumb));
 else
  printf("-");
 for(int j=k-1;j>=0;j--)
	 printf("%d",c[j]);
     printf("\n");


 
}
//大数加法
void add(int *a,int *b,int nNuma,int nNumb)
{
  int i,h,t; h=0;
  int k=0;
  int c[MAX];
  int na=nNuma;
  int nb=nNumb;
 for(;na-1>=0&&nb-1>=0;na--,nb--)
  {
	  t=a[na-1]+b[nb-1]+h;
      c[k]=t%10;
      h=t/10;
	  k++;
  }
 if(t>=10)
	h=t/10;
 else
	 h=0;
 if(na==nb)
 {
  c[k]=h;k++;
 }
 if(na-1>=0)
 {
   for(i=na-1;i>=0;k++,i--)
   {  c[k]=a[i]+h;
      h=0;  }
 }

 if(nb-1>=0)
 {  
   for(i=nb-1;i>=0;k++,i--)
   {  c[k]=b[i]+h;  
      h=0;
   }
 }
 printf("差为:  ");
  for(int j=k-1;j>=0;j--)
	 printf("%d",c[j]);
     printf("\n");

}
bool compare(int *a,int *b,int nNuma,int nNumb)
{
  int i=0;
  bool sign;
  int na=nNuma;
  int nb=nNumb;
 if(na>nb)
  sign=true;
 else if(na==nb)
 { while(a[i]==b[i])
    i++; 
 if(a[i]<b[i])  sign=false;   //a[]小于b[]
 else   sign=true; 
 }

 else if(na<nb)   //nb>na
  sign=false;
 return sign;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值