服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言超详细讲解字符串相乘

C语言超详细讲解字符串相乘

2022-11-01 15:33Fighting阳! C/C++

这篇文章主要介绍了用C语言如何来实现字符串相乘的方法,这里我们会利用到memset函数,memset函数是对较大的结构体或数组进行清零操作的一种最快方法,可以说是初始化内存的“万能函数”,下面我们详细了解一下

前言

我们已经知道,正常的两位整形数据通过*相乘,C语言中int为4字节,32bit(字节),其机器码第一位为符号位,余下31位表示数字,表示范围:-2^31(-2147483648)~2^31-1(2147483647),但超过了这个范围我们该如何做呢?

提示:将数字以字符串的形式进行操作

一. 分析思路

示例:

C语言超详细讲解字符串相乘

我们把每一个数都看成是一个字符串,每一个元素为十进制数字所对应的字 符,由于是后面的元素先进行运算,故我们应当把末尾的字符赋值给a[0],以此类推。如下所示:(s1,s2分别表示两个相乘的字符串)

for(i=0; i<n; i++)
          a[i]=s1[n-i-1]-'0';
      for(i=0; i<m; i++)
          b[i]=s2[m-1-i]-'0';

当我们把需要操作的前后顺序弄清之后,接下来就是核心的算法部分了(看了几篇关于这个的博文,都没有详细的去解释这个问题)。其实上一张图片已经展示了将要做的算法步骤,但是说实话也不是说得很清楚,接下来看一下这张图片:

C语言超详细讲解字符串相乘

当我们把需要做的元素具体化之后,我们看到了其中的一个规律,上下能够进行相加的数字(通过-‘0'已经变成了数字)他们的因数的角标和是相等的,那么,我们就知道如何进行计算:

/* 乘运算*/
      for(i=0; i<n; i++)
          for(j=0; j<m; j++)
              c[i+j]+=a[i]*b[j];

n,m分别代表字符串的长度,也就是相乘元素的个数。解决了这个问题,剩下的问题便不是问题

 

二、使用步骤

1.代码如下

代码如下(示例):

//大数乘法(字符串相乘)
#include<stdio.h>
#include<math.h>
#include<string.h>
#define M 10005
char s1[M],s2[M],s[M];
int a[M],b[M],c[M];
int main()
{
  int i,j,m,n,k;
  while(~scanf("%s%s",s1,s2))
  {
      memset(c,0,sizeof(c));
      n=strlen(s1);
      m=strlen(s2);
      k=n+m;//保证相乘后的位数不会大于k
      printf("s1的长度=%d s2的长度=%d\n",n,m);
/*把字符串s1和s2逆序用数字排列*/
      for(i=0; i<n; i++)
          a[i]=s1[n-i-1]-'0';
      for(i=0; i<m; i++)
          b[i]=s2[m-1-i]-'0';
        /* 乘运算*/
      for(i=0; i<n; i++)
          for(j=0; j<m; j++)
              c[i+j]+=a[i]*b[j];
      for(i=0; i<=k; i++)//进行进位操作
      {
          if(c[i]>=10)
          {
              c[i+1]+=c[i]/10;
              c[i]%=10;
          }
      }
/*去除前导0*/
      i=k;
      while(c[i]==0) i--;
/*判断两个非负数之积是否为0,以及逆序打印c[]*/
      if(i<0) printf("0");
      else
      {
          for(; i>=0; i--)
              printf("%d",c[i]);
      }
      printf("\n");
  }
  return 0;
}

2、memset函数

这里我们利用memset将c进行初始化,那为什么不直接char c[]={0}?是因为如果字符串太长,将会使代码运行较慢,并不是最优解,而memset函数是直接访问地址,运行速度将会提升。

C语言超详细讲解字符串相乘

memset有三个参数,通过图片我们发现依次为数组名,赋值整形,以及类型字节长度,我们可以利用sizeof(void)求出

 

三、总结

对于这里相乘的算法,一开始也不是很清楚,但当把他这种抽象的东西表达出来使其具象化,也不难看出其中的奥妙。

到此这篇关于C语言超详细讲解字符串相乘的文章就介绍到这了,更多相关C语言 字符串相乘内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/NEFUT/article/details/123814634

延伸 · 阅读

精彩推荐
  • C/C++OpenCV实现二值图像的边缘光滑处理

    OpenCV实现二值图像的边缘光滑处理

    这篇文章主要为大家详细介绍了OpenCV实现二值图像的边缘光滑处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    萌哒萌哒10212021-09-16
  • C/C++C++使用string的大数取模运算(5)

    C++使用string的大数取模运算(5)

    这篇文章主要为大家详细介绍了C++使用string的大数取模运算,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    好想告诉你wt5832021-08-02
  • C/C++C++中stringstream的用法和实例

    C++中stringstream的用法和实例

    下面小编就为大家带来一篇C++中stringstream的用法和实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C++教程网10862021-04-22
  • C/C++彻底理解 C 语言中的指针

    彻底理解 C 语言中的指针

    注意这里的限定,再读一遍,没有高级语言,没有操作系统,在这样的限制之下,你必须直面内存读写的本质。...

    C语言与C++编程9512022-01-06
  • C/C++C语言入门篇--初识结构体

    C语言入门篇--初识结构体

    本篇文章是基础篇,适合c语言刚入门的朋友,本文对c语言的结构体做了简单的分析,帮助大家快速入门c语言的世界,更好的理解c语言...

    yycure9422021-12-22
  • C/C++c语言的cps实现求fibonacci数列示例

    c语言的cps实现求fibonacci数列示例

    这篇文章主要介绍了c语言的cps实现求fibonacci数列示例,需要的朋友可以参考下...

    C语言程序设计5672021-01-17
  • C/C++C/C++ 避免数组越界的方法

    C/C++ 避免数组越界的方法

    这篇文章主要介绍了C/C++ 避免数组越界的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    慢慢爬的绿毛龟10122021-09-10
  • C/C++C语言模拟实现C++的继承与多态示例

    C语言模拟实现C++的继承与多态示例

    本篇文章主要介绍了C语言模拟实现C++的继承与多态示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    snow_52883962021-05-11