看到了这个题目,就突然要写了,完全徒手写的, itoa_m 数字转换成字符串 是拷贝过来的,也是我积累的源码。

这个大整数 主要思想就是按照我们小学学习的 乘法 笔算方法,先单个 乘积,再相加,具体不说了,你应该明白的。

这个主要难点就是 字符串转数字 和数字转字符串 以及字符转相加。

由于我是用了std::string 所以简单许多。如果改成C语言版本的,还要做许多工作。

程序包括了我临时写的 两个大整数相加 的函数。

可以通过 开始 运行 (Win+R) ,输入 calc 打开计算机 进行对比。不知道 有没有 Bug!

这么一个小程序,好像 费了我一个多小时,关键 就是类库的积累,有类库会很方便的。如果用C 要更长时间,因为没太多可用的类库,如果用java,拥有庞大的类库,写这个程序应该简单的不得了了吧!!

http://hero.pongo.cn/Question/Details?ID=6&ExamID=6
/*两个大数相乘:char* multiply(char*,char*)。给了两个字符串,每个都是代表了一个很长的10进制表示的数, 比如 String str1 = "23456789009877666555544444"; String str2 = "346587436598437594375943875943875", 最后求出它们的乘积。 不用jdk的数学运算包BigInteger.或者类似的包。*/#include<string>
#include<iostream>
#include<stdio.h>using namespace std;
string strPlusAsNum(string str1,string str2);string ZeroNum(int num){string result="";for(int i=0;i<num;i++){result+="0";}return result;
}
char * itoa_m(int n){char* arrBuff=NULL;int radix=10;char tmp[33];char* tp = tmp;int i;unsigned v;int sign;char* sp;if (radix > 36 || radix <= 1){
//        __set_errno(EDOM);//return 0;radix=10;}sign = (radix == 10 && n < 0);if (sign)v = -n;elsev = (unsigned)n;while (v || tp == tmp){i = v % radix;v = v / radix;if (i < 10)*tp++ = i+'0';else*tp++ = i + 'a' - 10;}if (arrBuff == 0){arrBuff=(char*)malloc((tp-tmp)+sign+1);}sp = arrBuff;if (sign)*sp++ = '-';while (tp > tmp)*sp++ = *--tp;*sp = 0;return arrBuff;
}int main(){//    string str1="2345678900987766554411223301",str2="346587436598437594375943875943875";
string str1="1234",str2="1234";cout<<"============"<<endl;cout<<"Biginteger 相乘运算"<<endl;cout<<"============"<<endl;cout<<"输入Num1=";cin>>str1;cout<<"输入Num2=";cin>>str2;string result;int wei1=strlen(str1.data());int wei2=strlen(str2.data());string * calcOneBit=new string[wei2];for(int i=0;i<wei2;i++){calcOneBit[i]+=str2.data()[wei2-i-1];int n1=atoi(calcOneBit[i].data());calcOneBit[i]="";//清空int str1_jinwei=0;string temp;for(int j=0;j<wei1;j++){//进行一位与str1的计算结果 保存到calcOneBit[i]中temp=str1.data()[wei1-j-1];int n2=atoi(temp.data());int n=n1*n2;n+=str1_jinwei;if(n>=10){str1_jinwei=n/10;n=n%10;}else{str1_jinwei=0;}temp=calcOneBit[i];char *ccc=itoa_m(n);calcOneBit[i]=ccc; free(ccc);calcOneBit[i]+=temp;cout<<"calcOneBit["<<i<<"]="<<calcOneBit[i].data()<<endl;}if(str1_jinwei>0){temp=calcOneBit[i];char * cc=itoa_m(str1_jinwei);calcOneBit[i]=cc;free(cc);calcOneBit[i]+=temp;cout<<"&& calcOneBit["<<i<<"]="<<calcOneBit[i].data()<<endl;}}for(int i=0;i<wei2;i++){if(i>0)calcOneBit[i]+=ZeroNum(i);cout<<" "<<i<<" "<< calcOneBit[i].data()<<endl;}result=calcOneBit[0];for(int i=0;i < wei1 - 1;i++){result=strPlusAsNum(result,calcOneBit[i+1]);}cout<<"========================"<<endl;cout<<""<<str1.data()<<" * "<<str2.data()<<" = "<<result.data()<<endl;cout<<"========================"<<endl;return 0;
}string strPlusAsNum(string str1,string str2){int size1=strlen(str1.data());int size2=strlen(str2.data());int size=size1>size2 ? size1 : size2;int jinwei=0;string result="",temp="";for(int i=0;i<size;i++){int n1,n2,n;//n1if(i<size1){string temp2;temp2=str1.data()[size1-i-1];n1=atoi(temp2.data());}else{n1=0;}//n2if(i<size2){string temp2;temp2=str2.data()[size2-i-1];n2=atoi(temp2.data());}else{n2=0;}//Plus nn=n1+n2;n+=jinwei;if(n>=10){jinwei=n/10;n=n%10;}else{jinwei=0;}//n to stringchar * cc=itoa_m(n);temp=result;result=cc;free(cc);result+=temp;}if(jinwei>0){temp=result;char * cc=itoa_m(jinwei);result=cc;free(cc);result+=temp;}return result;
}

转载于:https://www.cnblogs.com/ayanmw/archive/2012/12/28/2837682.html

两个大整数相乘 C++ 版本 源码相关推荐

  1. C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...

  2. 循环相乘取整法C语言,华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...

  3. 漫画:如何实现大整数相乘?(下)

    戳蓝字"CSDN云计算"关注我们哦! 如何用程序实现大整数相乘呢? 在上一篇文章  漫画:如何实现大整数相乘?(上) 当中,我们介绍了两种思路: 1.像列竖式一样,把两整数按位依次 ...

  4. 漫画:如何实现大整数相乘?(上)

    戳蓝字"CSDN云计算"关注我们哦! 前一段时间,小灰发布了一篇有关大整数相加的漫画,没看过的小伙伴可以先看一看: 漫画:如何实现大整数相加? 那么,大整数相乘又是如何实现的呢? ...

  5. 第六周作业(等值字串,KMP匹配,大整数相乘,最长公共子串,判断两个字符串是否匹配,最长回文子串,年号字串)

    目录 1.等值字串 2.KMP匹配 3.大整数相乘 4.最长公共子串 5.判断两个字符串是否匹配 6.最长回文字串 7.年号字串 补发一下,原来忘记发了. 1.等值字串 [问题描述]如果字符串的一个子 ...

  6. 大整数相乘 + 分治法(JS)

    使用分治法来实现大整数相乘 相乘的基本原理 如: 1234 * 567 第一步:分解234 -> 12 和 34;567 -> 5 和 67; 第二步:分别计算 首部: 12*5=60中部 ...

  7. python长整数相乘_python写的大整数相乘的方法

    输入 72106547548473106236 982161082972751393 两个大整数 输出结果 70820244829634538040848656466105986748 解题思路 首先 ...

  8. 拼多多2018校招内推编程-大整数相乘

    编程题] 大整数相乘 时间限制:1秒 空间限制:32768K 有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示.不能用系统自带的大整数类型. 输入描述: 空格分隔的两个字符串,代表 ...

  9. 分治法的经典问题——大整数相乘

    分治法的经典问题--大整数相乘 分治法的原理 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解.即一种分目标 ...

最新文章

  1. OpenGL进阶(十三) - GLSL光照(Lighting)
  2. java中sql去除游标_java.sql.SQLException:-ORA-01000:已超过最大打开游标
  3. 2.3.5 mysql角色管理
  4. 浅谈导航电子地图的组成和制作流程
  5. 基于vue 2.X和高德地图的vue-amap组件获取经纬度
  6. python execute_command err_Python management.execute_from_command_line方法代碼示例
  7. iOS开发ARC内存管理
  8. php getdefaultvalue,PHP ReflectionParameter getDefaultValueConstantName()用法及代码示例
  9. 如何使用vSphere Client 将文件上传到EXSI服务器的方法步骤
  10. VMware15.5安装Linux虚拟机(Centos7)图文教程
  11. toj 2798 Farey Sequence
  12. firewalld--centos7.x的防火墙--使用流程步骤:
  13. 次世代教程_角色《佛特艾斯》制作具体分析
  14. OA系统权限管理设计方案
  15. CutefishOS 0.6 Beta 发布
  16. dva处理_dva 源码解读
  17. 使用U盘制作系统盘(龙芯镜像)
  18. 开源的高性能Java集合:GNU Trove介绍
  19. 浅谈中国电信出口网络的链路情况(什么是 ChinaNet,CN2,GT,GIA)
  20. wordpress插件_WordPress插件可成功进行内容营销

热门文章

  1. 093:QuerySet API详解-QuerySet转换为SQL的条件
  2. httpclient的post请求超时
  3. [Web 前端] SuperAgent中文使用文档
  4. 如何反编译.apk(注:CSDN上提供的资源过时了,都用不了)
  5. 使用“管道”与“应用程序生命周期”重构:可插拔模块
  6. Adobe Photoshop CC 打开时报错~配置错误:请卸载并重新安装该产品
  7. Esxi自动化配置脚本
  8. 编译AVX代码,升级Redhat 5.5 GCC至4.7.1
  9. ?请问怎样将excel表格中的时间格式读取为字符串格式?
  10. spark python入门教程_你是如何自学 Python 的?