大数的加、减、乘、除、幂运算(C语言)

简介: 大数的加、减、乘、除、幂运算(C语言)

大数的加法运算:

大数的加法就是利用字符串输入然后转化为两个数组,然后相加存入另一个数组,如果大于10就要进一。

程序代码:

#include<stdio.h>
#include<string.h>
char s1[5000],s2[5000];
int a[5000],b[5000],c[10000];
int main()
{
  int i,j,k,n,m,t;
  while(scanf("%s%s",s1,s2)!=EOF)
  {
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    n=strlen(s1);
    m=strlen(s2);
    k=0;
    for(i=n-1;i>=0;i--)
      a[k++]=s1[i]-'0';
    k=0;
    for(i=m-1;i>=0;i--)
      b[k++]=s2[i]-'0';
    if(n<m)
      k=m;
    else
      k=n;
    t=k;
    for(i=0;i<k;i++)
    {
      c[i]=a[i]+b[i]+c[i];
      if(c[i]>=10)
      {
        c[i]=c[i]%10;
        c[i+1]=1;
        if(i+1==k)
          t=k+1;
      }
    }
    for(i=t-1;i>=0;i--)
      printf("%d",c[i]);  
    printf("\n");
  }
  return 0;
}

大数减法:

大数减法要保证大的减去小的,然后先比较大小写一个函数利用减法运算,运算时减不够的前位减1,后位加10.

程序代码:

#include<stdio.h>
#include<string.h>
char s[5000],s1[50000];
int a[50000],b[50000],c[50000];
void sub(int x[],int y[],int z)
{
  int i;
  for(i=0;i<z;i++)
  {
    c[i]=x[i]-y[i]+c[i];
    if(c[i]<0)
    {
      c[i]=10+c[i];
      c[i+1]=-1;
    }
  }
  for(i=z-1;i>=0;i--)
  {
    if(c[i]==0)
      z--;
    else
      break; 
  }
  for(i=z-1;i>=0;i--)
    printf("%d",c[i]);
  printf("\n");
}
int main() 
{
  int i,j,k,n,m,t;
  while(scanf("%s%s",s,s1)!=EOF)
  {
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    n=strlen(s);
    m=strlen(s1);
    k=0;
    for(i=n-1;i>=0;i--)
      a[k++]=s[i]-'0';
    k=0;
    for(i=m-1;i>=0;i--)
      b[k++]=s1[i]-'0';
    if(n>m)
      sub(a,b,n);
    else if(n<m)
    {
      printf("-");
      sub(b,a,m);
    }
    else
    {
      for(i=0;i<n;i++)
      {
        if(a[i]==b[i])
          continue;
        else if(a[i]>b[i])
        {
          sub(a,b,n);
          break;
        }
        else
        {
          printf("-");
          sub(b,a,n);
          break;
        }
      }
    } 
  }
  return 0;
}

大数乘法:

大数乘法跟大数加法类似,先乘后加,就是让每一次乘得的结果先存储到数组里面,因为两个数相乘最大位数也不过两个数的长度。

程序代码:

#include<stdio.h>
#include<string.h>
char s[5000],s1[5000];
int a[5000],b[5000],c[5000];
int main()
{
  int i,j,k,t,n,m,sum;
  while(scanf("%s%s",s,s1)!=EOF)
  {
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    n=strlen(s);
    m=strlen(s1);
    sum=n+m;
    k=0;
    for(i=n-1;i>=0;i--)
      a[k++]=s[i]-'0';
    k=0;
    for(i=m-1;i>=0;i--)
      b[k++]=s1[i]-'0';
    for(i=0;i<n;i++)
      for(j=0;j<m;j++)
        c[i+j]=c[i+j]+a[i]*b[j];  
    for(i=0;i<sum;i++)
    {
      if(c[i]>=10)
        c[i+1]=c[i+1]+c[i]/10;
      c[i]=c[i]%10;
    } 
    for(i=sum-1;i>0;i--)
    {
      if(c[i]==0)
        continue;
      else
        break;
    }
    while(i>=0)
    {
      printf("%d",c[i]);
      i--;
    }
    printf("\n");
  }
  return 0;
} 

大数幂:

大数幂也可以看成是大数乘法,可以把每一次乘得的结果作为每一次底数乘对象,然后循环n-1次。

程序代码:

#include<stdio.h>
#include<string.h>
char s[20];
int a[500000],b[500000];
int count=0;
void cheng(int a[],int b[],int m);
int main()
{
  int i,k,j,n,m;
  while(scanf("%s%d",s,&n)!=EOF)
  {
    
    if(s[0]=='0'&&n==0)
      break;
    if(n==0)
    {
      printf("1\n");
      continue;
    }
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    m=strlen(s);
    j=k=0;
    for(i=m-1;i>=0;i--)
    {
      a[k++]=s[i]-'0';
      b[j++]=s[i]-'0';
    }
    n--;
    while(n)
    {
      cheng(a,b,m);
      n--;
    }
    for(i=1005;i>0;i--)
    {
      if(b[i]==0)
        continue;
      else
        break;
    } 
    while(i>=0)
    {
      printf("%d",b[i]);
      i--;
    }
    printf("\n");
  }
  return 0;
}
void cheng(int a[],int b[],int m)
{
  int i,j,k;
  int c[5000];
  memset(c,0,sizeof(c));
  for(i=0;i<m;i++)
    for(j=0;j<1005;j++)
    { 
      c[i+j]=c[i+j]+a[i]*b[j];
    }
  for(i=0;i<1005;i++)
  {
    if(c[i]>=10)
      c[i+1]=c[i+1]+c[i]/10;
    b[i]=c[i]%10;
  }
}

大数除法:

这里由于大数除法比较麻烦,后面会接着有大数求余和大数阶层的时候详细讲解, 见谅!!!!!

相关文章
|
C语言
c语言之两个数相加
c语言之两个数相加
|
5月前
|
架构师 NoSQL C语言
[深入浅出C语言]理解取整、取余和取模
推荐一个零声教育C/C++后台开发的免费公开课程,个人觉得老师讲得不错,分享给大家:C/C++后台开发高级架构师,内容包括Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,[立即学习]
99 2
|
6月前
|
C语言
C语言两个数相除怎么得到浮点数
有些时候,使用C语言的相除运算符计算两个变量相除运算结果,可是却无法保留小数,比如3/2,打印输出是1,而不是1.5之类有小数的值。这是为什么呢?可能有两种原因,如下
72 2
|
存储 算法 C语言
C语言/计算整数二进制位中的1的个数
C语言/计算整数二进制位中的1的个数
|
6月前
|
C语言
C语言自增减、逻辑运算、位运算、位移运算及三目运算操作
C语言自增减、逻辑运算、位运算、位移运算及三目运算操作
48 0
|
算法 C++
剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)
剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)
|
算法 C++
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
剑指offer 73. 不用加减乘除做加法
剑指offer 73. 不用加减乘除做加法
61 0
|
C语言 Python
【C语言】负数取模、取余
首先谈谈关于数学取整的问题
|
存储 Java 大数据