UVa - 10106 - Product
2014-05-07 12:46
411 查看
高精度乘法(大数乘大数)
纠结了一段时间才过的,每次以为调好一试又错了...
用二维数组是参考了别人的想法,不过有点耗空间和时间。
感觉用时有点长,应该还能优化。
用函数库的strrev(字符串反转)函数过不了,它不是ANSI C的 ?
纠结了一段时间才过的,每次以为调好一试又错了...
用二维数组是参考了别人的想法,不过有点耗空间和时间。
感觉用时有点长,应该还能优化。
用函数库的strrev(字符串反转)函数过不了,它不是ANSI C的 ?
#include<stdio.h> #include<string.h> #include<stdlib.h> #define maxn 255 #define maxN 510 char a[maxn],b[maxn]; int cal[maxN][maxN],res[maxN]; void mystrrev(char *string) { int i,len=strlen(string); char temp; for (i=0;i<len/2;i++) { temp=string[i]; string[i]=string[len-i-1]; string[len-i-1]=temp; } } void mult(char *a,char *b) { int alen=strlen(a),blen=strlen(b); int i,j,k,up,sum; mystrrev(a); mystrrev(b); for(i=0;i<blen;i++) for(j=i,k=0;k<alen;j++,k++) cal[i][j]=(a[k]-48)*(b[i]-48); for(j=0;j<maxN;j++) for(i=0;i<blen;i++) res[j]+=cal[i][j]; for(i=up=0;i<maxN;i++) { sum=res[i]+up; up=sum/10; res[i]=sum%10; } for(j=maxN-1;j>=0;j--) if(res[j]) break; for(i=j;i>=0;i--) printf("%d",res[i]); putchar('\n'); } int main() { while(scanf("%s%s",a,b)==2) { if(a[0]=='0'||b[0]=='0') { printf("0\n"); continue; } memset(res,0,sizeof(res)); memset(cal,0,sizeof(cal)); mult(a,b); } return 0; }
相关文章推荐
- shell特殊字符
- 在linux环境下部署伪分布式hadoop遇到的问题
- C语言程序所占内存分类
- UEditor上传图片等附件都出现红叉
- 第三周作业
- linux压缩包解压缩
- 静态链表
- SQL一列三行变成一列一行
- java JDBC(二):Statement、ResultSet、PreparedStatement
- Vim常用配置(~/.vimrc)(转载)
- 网络垃圾的来源和处理措施详解
- POJ 2195 二分图最小权匹配KM算法
- XCODE插件 之 Code Pilot 无鼠标化
- matlab基础知识 randperm()的用法
- 20140506朗沃(1)
- linux下安装loadrunner步骤以及出错解决方法(外加linux下ip地址欺骗)
- C++ 指针和多维数组
- 使用srvany.exe将程序安装成windows服务的详细教程
- Exchange2010RPC配置静态RPC端口客户端访问、通讯簿服务和公用文件夹连接
- OpenStack看似给我们提供了非常多的选项