高精度运算
2016-03-10 14:30
330 查看
1、 有关%运算
类似题目之前写过一次,但是这次写到又给忘记了(# ̄~ ̄#)接下来看题:
代码如下:
#include<stdio.h> __int64 yanghui[1050][1050]; int main(){ int i,j; //求杨辉三角形 for(i=0;i<1010;i++){ for(j=0;j<=i;j++){ if(j==0||j==i){ yanghui[i][j]=1; } else { /* 由于yanghui[i][j]范围最终可能超过int 所以应当边%边+ 使yanghui[i][j]大小控制在一定范围内 同理如遇到乘法也应边%边* */ yanghui[i][j]=(yanghui[i-1][j-1]+yanghui[i-1][j])%707063423; } } } scanf("%d%d",&n,&m); printf("%I64d",yanghui [m]); return 0; }
2、 数组模拟乘法
运用数组模拟竖式乘法的过程来达到int范围不支持的高精度的运算例题题目:
代码如下:
/************************************************************** ***竖式乘法运算*** 1 2 3 4 × 5 -------------------- 1 2 7 0 写下个位,十位以上往前进位 3×5+2=17 ************************************************************** * 数组模拟运算类似此法 每位数字先*i再进行进位 与 由低位到高位边乘i边进位效果相同 * **************************************************************/ #include<stdio.h> int a[3000]=1;//记录数字的每一位数。1000!大约有2500+位 int main(){ int i,j; int n; int length=1;//记录数字长度 scanf("%d",&n); a[1]=1; for(i=1;i<=n;i++){ //每位数*i for(j=1;j<=length;j++){ a[j] *= i; } //进阶 for(j=1;j<=length;j++){ a[j+1] += a[j]/10;//进位 a[j] %= 10;//取个位 } //此时j==length+1 /*拆分最高位 * *若a[j]==0则说明原最高位*i之后没有进位;a[j]!=0时则有进位 * *a[j]可能不是一位数字 故需对a[j]进行拆分 *并重新计算数字长度 * */ while(a[j] != 0){ length++; a[j+1] += a[j]/10; a[j] %= 10; j++; } } for(i=length;i>=1;i--){ printf("%d",a[i]); } printf("\n"); return 0; }
以上代码中,a[i]仅存了一位数字。在内存和精度要求更高的情况下,可以使a[i]存三位四位甚至更多位的数字。只需要将以上代码中的10改成相应的10的倍数即可。
相关文章推荐
- 常用工具类之C++线程安全集合类
- Concurrency::task(C++)
- c++第一次上机报告
- 第二次c++上机
- C++ CopyFile函数的用法
- C++中的find函数
- 快速排序的Java语言与C语言实现
- 使用Visual Studio编译MYSQL CONNECTOR C/C++(MYSQLCPPCONN)
- 【c++】菱形虚拟虚拟继承模型探索
- C++封装 mysql C api遇到的问题
- C++11:如何判断一个类是另一个模板类的子类?
- C++总结之const限定符
- 《c语言全局变量的用法》
- Problem B: C语言习题 学生成绩输入和输出
- Problem A: C语言习题 计算该日在本年中是第几天
- C语言试题记录
- C++类复制构造函数参数为nonconst和const的重载
- C/C++获取当前系统时间
- C++上机报告-2
- C++第1次上机作业