大数的加、减、乘、除、幂运算(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;
  }
}

大数除法:

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

相关文章
|
Rust Unix Linux
【一起学Rust | 进阶篇 | Service Manager库】Rust专用跨平台服务管理库
【一起学Rust | 进阶篇 | Service Manager库】Rust专用跨平台服务管理库
449 0
|
11月前
|
数据可视化 开发者 索引
详解Wireshark LUA插件函数:function p_myproto.dissector(buffer, pinfo, tree)
在 Wireshark 中,LUA 插件通过 `function p_myproto.dissector(buffer, pinfo, tree)` 扩展协议解析能力,解析自定义应用层协议。参数 `buffer` 是 `PacketBuffer` 类型,表示原始数据包内容;`pinfo` 是 `ProtoInfo` 类型,包含数据包元信息(如 IP 地址、协议类型等);`tree` 是
459 1
|
IDE 测试技术 开发工具
NumPy 代码调试与错误处理
【8月更文第30天】NumPy 是 Python 中用于科学计算的核心库之一,提供了高性能的多维数组对象和大量的数学函数。尽管 NumPy 提供了许多方便的功能,但在实际编程过程中难免会遇到各种各样的问题。本文将介绍一些调试 NumPy 代码的技巧,并讨论如何处理常见的错误。
726 2
|
存储 人工智能 缓存
数据结构顺序表和链表(超详细)
数据结构顺序表和链表(超详细)
252 1
|
算法 调度 C语言
C/C++学习 -- SHA-256算法
C/C++学习 -- SHA-256算法
367 0
|
算法 安全 架构师
浅浅瞅瞅RSA-PSS 算法
浅浅瞅瞅RSA-PSS 算法
631 0
|
并行计算 PyTorch 算法框架/工具
Pytorch:模型的保存/加载、并行化、分布式
Pytorch:模型的保存/加载、并行化、分布式
247 0
|
运维 Java 程序员
一个合格的程序员,需要哪些必备技能?
对于一个Java开发来说,编程技能毋庸置疑是很重要的。 但是,除了基本的编程开发能力,其他方面的能力也是体现一个程序员的能力的很重要因素。 比如,问题排查能力、线上运维能力、项目管理能力、协调沟通能力等。 本文,主要来简单介绍一下,作为一个合格的Java开发,除了自身技术成长之外,还有哪些方面可以提升。 类开发技能 第一类,并不是纯coding技能,但是也和开发相关,我称之为类开发技能。 Linux系统 很多人的开发机器是windows,所以平时也基本都是图形化开发界面。但是,这并不意味着你就不需要基本的Linux技巧。 因为,你开发出来的应用可能部署在一台Linux机器上,很
833 0
|
安全 测试技术 网络安全
使用Burp Suite进行Web应用渗透测试
使用Burp Suite进行Web应用渗透测试
419 0
|
机器学习/深度学习 存储 算法
(建议收藏)一文多图,彻底搞懂Floyd算法(多源最短路径)
在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径。
9426 2
(建议收藏)一文多图,彻底搞懂Floyd算法(多源最短路径)

热门文章

最新文章