C语言中如何实现对超大数据的存取与运算
来源:互联网 发布:网络信息安全员证书 编辑:程序博客网 时间:2024/04/19 03:26
方法一:
对于超大的整型来说 int . long . long long. 都在存储范围上边无能为力 ,此时我们可以想到浮点数据类型 float. double
但是当我们 我们要计算一下1000!中含有多少个数字2的时候
首先我们当是100!时候
#include<stdio.h>#define N 100 int main(){double sum=1.0;int count=0;for(int i=1;i<=N;i++){sum*=i;;}while(sum/sum-1)//在这里我因为真正当sum/2用来计算所耗时间过长,所以这里我将2用sun-1替换了{count++;}printf("%lf\n含有%d个\n",sum,count);return 0;}这个结果如下,但是不是精确的,这是已经舍弃之后的数
下来当是200!时候
#include<stdio.h>#define N 1000int main(){double sum=1.0;int count=0;for(int i=1;i<=N;i++){sum*=i;;}while(sum/sum-1)//在这里我因为真正当sum/2用来计算所耗时间过长,所以这里我将2用sun-1替换了{count++;}printf("%lf\n含有%d个\n",sum,count);return 0;}
很明显超出了范围,所以用浮点数只能表示一定范围的数,至少100!表示不了,那怎么存储1000!呢?
哈哈! 我们也可以用数组存储呀!
这里关键要考虑到进位存储在搞标号的数组单元中
/********************************************************************** * Copyright (c)2015,WK Studios* Filename: * Compiler: GCC,VS,VC6.0 win32 * Author:WK * Time: 2015 4 18************************************************************************/ #include<stdio.h>#define Ma 10000 //a的最大容量,必须大于naint pa=0;//指向数组a的有效末端int p=2;//求阶乘时的当前乘数unsigned int carry=0;int memory_over=0;union data{ //表示范围0--2^32-1unsigned long int b;//这里也可以用数组usigned long int ,但是用公用体可以存储不同类型的数据}a[Ma];void main(){unsigned int n;//求n的阶void facto(unsigned int n);printf("Input n:");scanf("%u",&n); a[0].b=1;//初始化facto(n);//测试后至少可以计算10000!if(memory_over==0){printf("the result include %dNO:\n",pa+1);//高位输出printf("%u",a[pa--].b);for(;pa>=0;pa--){printf("%04u",a[pa].b);//04%d用来补充0限制每个int型中存放4位数}printf("\n");}getchar();}void facto(unsigned int n){void multiple();pa=0; while(pa< Ma-1 && p<=n)//容量限制{multiple();p++;//每一轮乘一个阶数p}if(p<=n)//此时pa>=Ma-1退出while循环说明超出数组所能存储的范围{printf("memory out!\n");memory_over=1;}//如果当前的存储结果的数组a[Ma]不够用!应提高Ma}void multiple(){int i=0;carry=0;while(i<=pa)//i指向当前处理的元素a[i],每一轮用一个位与阶数p相乘{a[i].b=a[i].b*p+carry;//计算结果,要考虑来自低位的进位carry=a[i].b/10000;//计算进位a[i].b=a[i].b%10000;//计算余数i++;} //储代码块后carry=0 if(carry>0)a[++pa].b=carry;}
0 0
- C语言中如何实现对超大数据的存取与运算
- c语言---数据的存储与运算
- C语言实现myql中存取二进制文件
- 【C语言】超大数乘法运算
- c语言-2.C语言的数据与运算
- 如何实现快速地从超大数据库中提取数据并进行相关的操作
- C 语言中实现数据与方法的封装
- C 语言中实现数据与方法的封装
- Javascript中如何高效的数据存取
- C++如何通过栈实现超大整型数据的相加
- 对C语言中赋值运算符的理解
- 基于Spark实现的超大矩阵运算
- 使用java语言操作,如何来实现MySQL中Blob字段的存取
- List对数据的存取
- C语言:存取结构体成员的点运算符(.)和箭头运算符(->)的区别
- C语言:存取结构体成员的点运算符(.)和箭头运算符(->)的区别
- C语言:存取结构体成员的点运算符(.)和箭头运算符(->)的区别
- 超大整数乘法运算——C语言
- 解决Unable to load R3 module C:\Program Files\Oracle\VirtualBox/VBoxDD.DLL (VBoxDD):
- Android中adb常用命令使用及问题
- itk::VTKImageToImageFilter使用问题
- 调用相册和相机
- 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管
- C语言中如何实现对超大数据的存取与运算
- MMORGP大型游戏设计与开发(客户端架构 part16 of vegine)
- Date型转为String型
- [BZOJ1452]JSOI2009 Count|树状数组
- 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记20 Multiple MVCs 多MVC模式、NavigationController导航控制器
- 找不到com.google.android.maps.*
- 简述负载均衡&CDN技术
- 【C语言】要求任意输入10个数,然后按从小到大顺序输出
- 解决Eclipse中文乱码