博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[算法题] 大数相乘
阅读量:6340 次
发布时间:2019-06-22

本文共 4722 字,大约阅读时间需要 15 分钟。

#include "oj.h"#include 
#include
#define OK 0#define ERROR -1/* 函数声明 */void calc1(char* pcStrA, int iLenA, int* piTmp, int num); void accumulate(int iIndex, int *piResult, int iLenResult, int *piTemp, int iLenTemp);char* BignumMultiply(char* pcNumA,int iLenA,char* pcNumB,int iLenB,char* pcResult,int iLenResult); /*=============================================================== 调用calc1和accumulate函数计算大数相乘 ===============================================================*/char* BignumMultiply( char* pcNumA, int iLenA, char* pcNumB, int iLenB, char* pcResult, int iLenResult) { int i = 0; int j = 0; int num = 0; int index = 0; int *piTmp = NULL; int *piResult = NULL; /* 分配临时结果的存放空间 */ piTmp=(int*)malloc((iLenA+1)*sizeof(int)); piResult=(int*)malloc(iLenResult*sizeof(int)); memset(piTmp, 0, (iLenA+1)*sizeof(int)); memset(piResult, 0, iLenResult*sizeof(int)); for (i = iLenB - 1; i>=0; i--) { /* 获取乘数pcNumB中第i位的值 */ num = pcNumB[i] - '0'; /* 计算被乘数与第i位的乘积,结果保存在piTmp整型数组中 */ calc1(pcNumA,iLenA,piTmp,num); /* 将piTmp数组中的值加到piResult数组中 */ index++; accumulate(index,piResult,iLenResult,piTmp,iLenA+1); } printf("\n%s\n", pcResult); /* 去掉piResult中第一个非零数字前的零 */ i = 0; while (piResult[i++]==0); /* 将整形数组piResult中的值转化成字符串存入pcResult中 */ index = 0; for (j = i - 1; j < iLenResult; j++, index++) pcResult[index] = piResult[j] + '0'; if (iLenResult == i - 1) { pcResult[1] = '\0'; } else { pcResult[index] = '\0'; } free(piTmp); free(piResult); return pcResult;} /*=============================================================== 计算被乘数与乘数的某一位的乘积 ===============================================================*/ void calc1( char *pcStrA, int iLenA, int *piTmp, int num) { /* d两个位的乘积结果,remainder余数,carry进位 */ int i = 0; int result = 0; int remainder = 0; int carry = 0; /* 从被乘数字符串'\0'的前一位算起 */ for (i = iLenA - 1; i >= 0; i--) { result = pcStrA[i] - '0'; result *= num; remainder = (result + carry) % 10; carry = (result + carry) / 10; piTmp[i+1] = remainder; } if (carry) piTmp[0] = carry; else piTmp[0] = 0; } /*=============================================================== 将被乘数与乘数中一位数字的乘积结果计入res数组中 ==============================================================*/ void accumulate( int iIndex, int *piResult, int iLenResult, int *piTemp, int iLenTemp) { int i = 0; int j = 0; int m = 0; int n = 0; int remainder = 0; //余数 static int carry=0; for (j = iLenTemp - 1, i = 0; j >= 0; j--, i++) { m = piTemp[j]; n = piResult[iLenResult-iIndex-i]; if (m + n + carry >= 10) { remainder = (m + n + carry) % 10; carry = 1; } else { remainder = m + n +carry; carry = 0; } piResult[iLenResult - iIndex - i] = remainder; } }/***************************************************************************** Prototype : multiply Description : 两个任意长度的长整数相乘, 输出结果 Input Param : const std::string strMultiplierA 乘数A const std::string strMultiplierB 乘数B Output : std::string strRst 乘法结果 Return Value : int 0 正确 -1 异常*****************************************************************************/int multiply (const std::string strMultiplierA,const std::string strMultiplierB, std::string &strRst) { int i = 0; int j = 0; int lenA = 0; int lenB = 0; int lenResult = 0; char *pcNumA = NULL; char *pcNumB = NULL; char *pcResult = NULL; /* 计算两个字符串的长度,及存储结果所需要的空间 */ lenA = (int)strMultiplierA.length(); lenB = (int)strMultiplierB.length(); if (0 == lenA || 0 == lenB) { return ERROR; } pcNumA = (char*)strMultiplierA.c_str(); pcNumB = (char*)strMultiplierB.c_str(); lenResult = lenA + lenB + 1; /* 分配并初始化字符串数组 */ pcResult = (char*)malloc(lenResult * sizeof(char)); memset(pcResult, 0, lenResult); for (i = 0; i < lenResult-1; i++) *(pcResult + i) = '0'; /* 计算并输出计算结果 */ printf("The result is: %s",BignumMultiply(pcNumA,lenA,pcNumB,lenB,pcResult,lenResult)); for (i = 0; i < (int)strlen(pcResult); i++) { strRst += pcResult[i]; } //printf("\n%s\n", pcResult); free(pcResult); return OK;}
View Code

 

转载地址:http://knhoa.baihongyu.com/

你可能感兴趣的文章
tomcat启动报错
查看>>
mongorocks引擎原理解析
查看>>
oracle11g R2 RAC卸载grid
查看>>
ES6 结构和扩展运算符
查看>>
王利阳:电商大促 决战6.18
查看>>
kafka消息传输的事务定义
查看>>
实现LNMMP
查看>>
mysql的pid文件出现问题
查看>>
计算rem单位
查看>>
第七章 大网高级 ASA
查看>>
rsync+inotify触发式远程同步
查看>>
优秀设计师应当知道的几大UI设计原则(一)
查看>>
mongodb高级查询
查看>>
struts2.1 struts.devMode BUG解决方案
查看>>
日本法院裁定三星诉苹果专利侵权案败诉
查看>>
Windows Server 2012R2 桌面体验问题直通车
查看>>
Springboot配置文件读取报错Configuration property name 'projectUrl' is not valid:
查看>>
HTTP状态码
查看>>
今天的学习
查看>>
面试必问之JVM原理
查看>>