大数乘法(二)
2016-03-17 22:29
225 查看
乘法运算过程模拟法
首先获取输入的乘数(a)与被乘数(b)字符串,按一般乘法运算过程,先是a的最后一位数字与b的最后一位数字相乘,接着a中用于相乘的数下标递减,直到a中所有数字与b最后一位都相乘过,保存结果后再递减b中的用于相乘的数字的下标,循环下去,直到b中每一位数都与a所有数相乘完。 在这个过程中,怎么遍历出填放结果的位置和处理进位是关键。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<conio.h> int main(){ char c; char *a=(char*)malloc(sizeof(char)*1000); char *b=(char*)malloc(sizeof(char)*1000); memset(a,'\0',1000); memset(b,'\0',1000); scanf("%s",b); scanf("%s",a); int lena=strlen(a); int lenb=strlen(b); int len=lena+lenb; char *result=(char *)malloc(sizeof(char)*(len+1)); //多开辟一个字节用于存放'\0'便于输出 memset(result,'0',len); result[len]='\0'; for(int i=lena-1;i>=0;i--){ int t=0,p=0,q=0,temp=0; int j; for(j=lenb-1;j>=0;j--){ p=(b[j]-'0')*(a[i]-'0'); temp=result[i+j+1]-'0'+p%10+t; result[i+j+1]=temp%10+'0'; t=temp/10+p/10;//填放在结果里发生的进位+运算过程中的进位 } if(t){ result[i+j+1]=result[i+j+1]+t; } } //第一个位置可能没有填充进位,所以如果第一个字符为'0'就不输出 if(result[0]=='0')puts(result+1); else puts(result); free(a); free(b); free(result); }
相关文章推荐
- Linux下物理内存和虚拟内存交换机制
- 在写一个iOS应用之前必须做的7件事(附相关资源)
- STL map
- 最近读到的好博文分享一下
- (2016春) 作业4:结对编程—词频统计
- 面向对象编程(五)多态--对象上下转型,动态绑定和静态绑定,应用
- usb设备驱动描述,王明学learn
- Zookeeper 5、Zookeeper应用场景
- 如何阅读学术论文
- 关于Linux的进程和线程
- 线程栈
- 2. Add Two Numbers LeetCode
- 合并排序
- kettle中设置日志表
- Haar特征初级
- 面向对象编程(三)封装--包
- 详解Cocos2d-X中宏CC_DLL(转)
- java连接oracle12c
- Android Studio adb无法启动解决方案
- 掌握Java字节码(转)