大数相乘
2015-08-20 11:08
169 查看
大数相乘的实现,在这里,采用最直接的实现方法:类似于手工计算,逐位相乘。
#include <iostream> using namespace std; //反转字符,使其符合数组低位为数字低位 void reverseNum(char* s1) { int i=0; int j=strlen(s1)-1; while(i<j) { char temp=s1[i]; s1[i]=s1[j]; s1[j]=temp; ++i; --j; } } //输入两个数字字符串,进行相乘,并返回结果字符串 char* BigNumMultiple(char* s1,char* s2) { //反转数字 reverseNum(s1); reverseNum(s2); int temp1,temp2,addFlag,multiFlag; int len1=strlen(s1); int len2=strlen(s2); temp1=temp2=0; char* result=new char[len1+len2+1]; memset(result,48,len1+len2); result[len1+len2]='\0'; //相乘 for(int i=0;i<=len1-1;i++) { multiFlag=0; addFlag=0; for(int j=0;j<=len2-1;j++) { temp1=(s1[i]-'0')*(s2[j]-'0')+multiFlag; multiFlag=temp1/10; temp1=temp1%10; temp2=(result[i+j]-'0')+temp1+addFlag; result[i+j]=temp2%10+'0'; addFlag=temp2/10; } result[i+len2]+=multiFlag+addFlag; } //去除高位多余的0 int n=strlen(result)-1; while(result =='0') { //确保结果为0的时候不会把最后一个0清空掉 if(n==0) break; result ='\0'; n--; } //恢复数字的字符串显示 reverseNum(s1); reverseNum(s2); reverseNum(result); return result; } //简单测试 int main() { while(true) { char* left=new char[100]; char* right=new char[100]; char* str; cin.getline(left,100); cin.getline(right,100); str=BigNumMultiple(left,right); cout<<left<<"*"<<right<<"=\n"<<str<<endl; system("pause"); } }
相关文章推荐
- Linux下安装Hadoop
- Masonry介绍与使用实践:快速上手Autolayout
- 开博随便写写
- 一个善意的谎言拯救一个团队 (又叫沙漠中的指南针)
- String.split的陷阱
- 快速排序及其优化
- Algorithms—152.Maximum Product Subarray
- Java 控制台输入 Scanner
- caffe bechmark.cpp 分析
- iOS中常见的几种存储方式
- mysql 插入时间段
- Linux下的同步与互斥
- Hive union all报错
- -Dmaven.multiModuleProjectDirectory system propery is not set
- exception is org.hibernate.hql.internal.ast.QuerySyntaxException: Driver is not mapped...的坑
- Javascript(一)-03-(语法的通用体现)
- Shiro标签
- java注解(Annotation)
- jquery插件之文字无缝向上滚动
- spring+springMVC+JPA配置详解