请教。。。大数存储问题?

lee673 2009-05-31 11:38:28
C语言里怎样存储一个超过整形数或是浮点型数最大范围的数?
有些运算结果很大并且要求得到其精确值,如要求1!+2!+...+40!=?的准确值(要精确到个位),这个数的位数很大,怎样把这个准确数表示出来?
...全文
319 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianqin625 2009-06-03
  • 打赏
  • 举报
回复
14楼的比较好做
chenyx329 2009-06-02
  • 打赏
  • 举报
回复
厉害啊,学东西长见识了
GoonYangXiaofang 2009-06-01
  • 打赏
  • 举报
回复
用字符串,按位计算大数相加大数相乘再到大数的阶乘;
这里有个我以前用C++写的大树的阶乘(LZ使用C语言吗),实质上先是实现了大数加法、乘法进而实现的阶乘;
稍微改一下就能求多个阶乘的和了。

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

string same_sign(string s1, string s2);
string multiplication(string s1, string s2);

int main()
{
string s1;
//string s2;
string s3;

while (cin >> s1)
{
if (s1 == "0")
{
cout << "1" << '\n' << '\n';
continue;
}

s3 = "1";
for (string s = "1"; ; s = same_sign(s, "1"))
{
s3 = multiplication(s, s3);

if (s == s1)
{
cout << s3 << '\n' << '\n';
break;
}

}
}


return 0;
}

string multiplication(string s1, string s2)
{
string s3 = "";

//第二个数为大数
if (s1.length() > s2.length())
{
string str_temp = s1;
s1 = s2;
s2 = str_temp;
}
for (int i = 0; i < s1.length(); ++i)
{
string str_temp;
for (int j = 0; j < s1[i] - '0'; ++j)
str_temp = same_sign(str_temp, s2);
for (j = 0; j < i; ++j)
str_temp += '0';
s3 = same_sign(s3, str_temp);
}

return s3;
}

string same_sign(string s1, string s2)
{
string s3 = "";

if (s1.length() > s2.length())
{
string s = s1;
s1 = s2;
s2 = s;
}
reverse(s1.begin(), s1.end());
reverse(s2.begin(), s2.end());

bool flag = false;
for (int i = 0; i < s1.length(); ++i)
{
int n;
if (flag)
n = s1[i] - '0' + s2[i] - '0' + 1;
else
n = s1[i] - '0' + s2[i] - '0';

s3 += char(n % 10 + '0');
if (n >= 10)
flag = true;
else
flag = false;
}
if (flag && s1.length() == s2.length())
s3 += '1';
else if (flag && s1.length() < s2.length())
{
for (int i = s1.length(); i < s2.length(); ++i)
{
int n;
if (flag)
n = s2[i] - '0' + 1;
else
n = s2[i] - '0';
s3 += char(n % 10 + '0');
if (n >= 10)
flag = true;
else
flag = false;
}
if (flag)
s3 += '1';
}
else if (!flag && s1.length() < s2.length())
for (int i = s1.length(); i < s2.length(); ++i)
s3 += s2[i];

reverse(s3.begin(), s3.end());

return s3;
}


lee673 2009-06-01
  • 打赏
  • 举报
回复
2楼的方法也很好。。。
lee673 2009-06-01
  • 打赏
  • 举报
回复
我试了一下,这种方法还不错的。。。
lee673 2009-06-01
  • 打赏
  • 举报
回复
谢了,我去试一下。。。
zjj2282680 2009-06-01
  • 打赏
  • 举报
回复
用数组呗
Dansley 2009-06-01
  • 打赏
  • 举报
回复
是一个典型的C语言题目,将大数做拆分就可以啦
donle1000 2009-06-01
  • 打赏
  • 举报
回复
随手写了一下 变量的命名不是太好...
思路都差不多, 先求阶乘,再求和


#include <iostream>
#include <cstring>

using namespace std;

int main()
{
int a[20000];
int fin[20000] = {0};
int n, array = 1, flag = 0;
cout << "input n: ";
cin >> n;
for(int k = 1; k <= n; k++)
{
memset(a, 0, 20000);
a[0] = 1;
for(int i = 1; i <= k; i++)
{
for(int j = 0; j < array; j++)
{
a[j] *= i;
a[j] += flag;
flag = a[j] / 10;
a[j] %= 10;
if(flag && j == array - 1)
array++;
}
}
flag = 0;
int x;
for(x = 0; x < array; x++)
{
fin[x] += a[x];
fin[x] += flag;
flag = fin[x] / 10;
fin[x] %= 10;
}
if(flag)
fin[x] = flag;
}
cout << "2^" << n << " = ";
array--;
for(;array >= 0; array--)
cout << fin[array];
cout << endl;
return 0;
}


ZH408482684 2009-06-01
  • 打赏
  • 举报
回复
数组和字符串都可以......
vanguards 2009-06-01
  • 打赏
  • 举报
回复
用数组来表示一个大数!
  • 打赏
  • 举报
回复
楼主,用gmp大数库吧,纯C的接口。
光宇广贞 2009-05-31
  • 打赏
  • 举报
回复
大数运算只能用数组。不过有数组的优化方法。可以去查一查。
KevinHo 2009-05-31
  • 打赏
  • 举报
回复
基本的大数类型都溢出了
ltc_mouse 2009-05-31
  • 打赏
  • 举报
回复
google “大数运算”~
lingyin55 2009-05-31
  • 打赏
  • 举报
回复
参考

以万来作为进制,用数组存储位数

#include<stdio.h>

int main( )
{
int n;
while( scanf("%d", &n) != EOF )
{
int j, i, k = 0, t = 0, p = 0; /*t表示当前计算结果有多少位,p是进位,i用来循环遍历当前计算结果的每一位*/
int sum = 0, s[ 16000 ] = { 0 };
s[ 0 ] = 1;
for(j = 1; j <= n; j++ )
{
for( i = 0; i <= t; i++ )
{
sum = s[ i ] * j + p;
p = 0;
if( sum > 9999 )
{
s[i] = sum % 10000;
p = sum / 10000;
if( t == i )
{
t++;
s[ t ] = 0;
}
}
else
s[ i ] = sum;
}
}
printf("%d", s[ t ]);
for( i = t - 1; i >= 0; i-- )
{
if ( s[ i ] < 10 ) printf("000");
else if ( s[ i ] < 100 ) printf("00");
else if ( s[ i ] < 1000 ) printf("0");
printf("%d", s[ i ]);
}
printf("\n");
}
return 0;
}



http://hi.baidu.com/onlys_c/blog/item/37f95f2386ecfa42ad34de02.html
liao05050075 2009-05-31
  • 打赏
  • 举报
回复
搜索一下“高精度运算”

69,380

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧