首页 > 学院 > 开发设计 > 正文

关于C语言实现高精度乘法运算

2019-11-14 12:51:48
字体:
来源:转载
供稿:网友

博主今年刚大一,对C语言并没有掌握得很好,趁寒假恶补一下,刚好遇见这题,这代码没有大神的那么精练。如有错可以指出。- -。 首先,我们知道,c语言所能表示的数字不是无限大的,32位操作系统中 int 类型最大能到2^32-1(负数比正数多1)。 显然当要表达的数大于它就无法表示。这时也就有了高精度运算。 其实高精度乘法运算就是用计算机来模拟我们小学学的乘法的运算法则。不啰嗦,先上代码

#include <stdio.h>#include <string.h>int main(){ char a[1000],b[1000]; //a、b 表示两个乘数 int c[1000]; //用来存储算出来的数 int i,j; scanf("%s%s",a,b); //输入 注意要用char类型 int lentha=strlen(a),lenthb=strlen(b); //计算两个数的位数 int na[lentha],nb[lenthb]; //注意这种写法(中括号里是变量)是C99、C11(忘了是哪个- -)的写法,有些编译器或oj(像poj - -)会报错。//把char类型转换为int类型的,注意要减'0',为什么自己想。。。 for (i=0,j=lentha-1;i<lentha;i++,j--) { na[i]=a[j]-'0'; } for (i=0,j=lenthb-1;i<lenthb;i++,j--) { nb[i]=b[j]-'0'; } for (i=0;i<1000;i++)//初始化 c[i]=0; for (i=0;i<lentha;i++)//核心代码,5行- -。注意这里没有进位 for (j=0;j<lenthb;j++) { c[i+j]+=na[i]*nb[j]; } for (i=0;i<lentha+lenthb;i++) //这里进行进位处理,想想为什么lentha+lenthb就够了,(我也不会证明...) { if (c[i]>=10) { c[i+1]+=c[i]/10; c[i]=c[i]%10; } } for (i=999;i>=0;i--)//这里低位在0这边,从高位输出,999其实可以优化但**本人很懒..** if (c[i]!=0||i==0) break; for (;i>=0;i--) PRintf("%d",c[i]); printf("/n"); return 0;}

该解释的解释完了。 总结一下,其实高精度乘法运算不难。其中这里边有借鉴其他博主的一些思想在这(最后输出的那地方)。望多多包涵。这也是本人第一篇博客,水平有限 有错欢迎指出。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表