大数加法、大数乘法以及大数比较大小

2 篇文章 0 订阅
1 篇文章 0 订阅
  • 大家好,我是海枫璐璐,以下内容是我们最近作业,我整理之后便分享在此,各位走过路过的 大神们 多多交流哦~~
如果各路神仙有空不妨点个赞,鼓励我不要脱发哈~

1.大数

首先,我们要知道什么是大数,大数就是指用我们平常常见的高级语言(C/C++) 的基本数据类型的最大长度都装不下的数据。例如:(57131278935467382462837648234294793287424727) 这些只能用 字符数组(char[])或者 字符串(string)来处理的大数。这里给大家介绍一下用字符串处理大数加法、大数乘法、大数比较大小(针对两位大数而言,并且都是正数)。

2.大数加法的实现思想

用字符串表示大数。将大数用十进制字符数组表示,模拟加法竖式计算的方法,从最低位开始相加,判断是否进1,一直到最高位。其中,注意要点:

  • 将字符数组转化为整型数字数组。

  • 因为大数与大数是一位一位运算的,还要涉及进位等,所以要把字符串倒过来赋值。

  • 进位运算之后要倒序输出结果。

3.大数乘法的实现思想

跟加法思想一样用字符串表示大数。模拟乘法竖式计算的方法(第一步,是将乘数与被乘数逐位相乘;第二步,将逐位相乘得到的结果,对应相加起来)其中,注意要点:

  • 乘法思想中用到了加法思想。

  • 第一个大数的第 i 位与第二个大数的第 j 位相乘,结果应该存放在结果的第 i+j 位上的这个结果往后顺移一位(放到第i+j+1位),最后从右向左累加时就多了一个空间。

4.大数比较大小思想

与大数的加法和乘法一样,用字符串表示大数。其中,注意要点:

  • 字符串长度不等时,通过字符串长度比较可以得出结果。

  • 字符串长度相等时,利用数组从最低位到最高位依次比较,得出结果。

5.具体代码实现如下

#include <stdio.h>
#include <string.h>
#define M 1000 //定义了数量M是1000作为数组初始化的数量 
 char s1[M],s2[M],s[M];
 int a[M],b[M],c[M];
 int len,len1,len2,i,j; 
 //(一 )两个大整数相加 
int Jia()     //自定义函数 "jia"
{ 
  len1 = strlen(s1);     //"strlen"是计算字符串长度的函数 
  len2 = strlen(s2);     //将输入的两个字符串的长度赋值给l1,l2
  if (len1 > len2)    //将len赋值为l1和l2中较长的那个
    len = len1;       
  else 
    len = len2;
    
  memset(a,0,sizeof(a));    //清零函数(字符串),实现数组初始化 
  memset(b,0,sizeof(b));    
  
    for(i=0;i<len1;i++)  //两个for循环是将输入的两个字符串倒过来
        a[i]=s1[len1-i-1]-'0';  //再将字符串里的字符转换为数字赋值给a,b整型数组 
    for(i=0;i<len2;i++) //大数太大,用任何整型变量都存不下 ,要用字符串存
        b[i]=s2[len2-i-1]-'0';  //因为大数与大数是一位一位运算的,还要涉及进位等,所以要把字符串倒过来赋值
                        
 for (int i = 0 ; i < len ; i++)
  {
    a[i] = a[i] + b[i];    //运算 
    a[i+1]+= a[i] / 10;    //如有进位,在后一位上加上 
    a[i] = a[i] % 10;      //原来那一位减掉进位了的 
 }
    if (a[len] != 0) len++;    //如果有进位就多显示一位
    while (a[len - 1] == 0 && len>1) len--;  //while去零
    for (int i = len - 1 ;i >= 0 ;i--)  //倒序输出结果 
    printf("%d",a[i]);
    printf("\n");
}      
//(二 )两个大数相乘
int C() //自定义函数"C" 
{
    len1 = strlen(s1);     //"strlen"是计算字符串长度的函数 
    len2 = strlen(s2);     //将输入的两个字符串的长度赋值给l1,l2
    len=len1+len2; //保证相乘后的位数不会大于len
    memset(a,0,sizeof(a));//初始化数组为0;
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    
    for(i=0;i<len1;i++)
        a[i]=s1[len1-i-1]-'0';  //将数字字符转化为数字;
    for(i=0;i<len2;i++)
        b[i]=s2[len2-i-1]-'0';  //把字符串s1和s2逆序用数字排列
 
    for(i=0; i<len1; i++)
    {
        for(j=0; j<len2; j++)
        {c[i+j]=c[i+j]+a[i]*b[j]; } //乘运算,把两数之积对应的每一位算出来 ,i,j从0开始往右左,后面进位运算 
    }
    for(i=0;i<=len;i++)
        {
           if(c[i]>=10) 
           {                             //进位运算
               c[i+1]=c[i+1]+c[i]/10;    //将十位上的数字进位 
               c[i]=c[i]%10;             //将个位上的数字留下 
           }
       }
        i=len;
        while(c[i]==0)//while去除前0
        {i--;}
        for(i=len; i>=0; i--)  //倒序输出
        printf("%d",c[i]);   
        printf("\n");
        return 0;
} 
//(三 )两数比较大小 
int BJ()//自定义函数"BJ"
{
  len1=strlen(s1);
  len2=strlen(s2);
 
  if(len1>len2)
         printf("s1>s2\n");
     if(len1<len2)
         printf("s1<s2\n");
     if(len1==len2)
         {
             for(i=0; i<len1; i++)
                 {
                     if(a[i]>b[i])
                     {
                         printf("s1>s2\n");
                         break;
                     }
                     if(a[i]<b[i])
                     {
                         printf("s1<s2\n");
                         break;
                     }
                     if(a[i]=b[i])
                     {
                         printf("s1=s2\n");
                         break;
                     }
     }
   }
}
int main() 
{
 printf("请输入两个大整数s1,s2,用空格隔开:\n");
  scanf("%s%s",s1,s2);
 printf("\n两数之和为:\n");  
 Jia();
 
 printf("\n请输入两个大整数s1,s2,用空格隔开:\n");
    scanf("%s %s",s1,s2);
    printf("\n两数乘积为:\n");
 C();
  
 printf("\n请输入两个大整数s1,s2,用空格隔开:\n");
 scanf("%s%s",s1,s2);
 BJ();
}

新手上路,请多多鼓励哈~~

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值