c语言怎么求当前电脑能表示的最大整型数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言怎么求当前电脑能表示的最大整型数?相关的知识,希望对你有一定的参考价值。

我们老师要求,找出最大的n,使得第n个Fibonacci数不超过计算机所能表示的最大整数,并给出具体的执行时间。我不知道怎么表示数字已超过计算机所能表示的最大整数,怎么求具体的执行时间呢?求高手指点一二

C++最大的整数类型是unsigned long long
你输出sizeof(unsigned long long),就知道unsigned long long有多少位了,那你就知道有多大了吧

执行时间
用time.h里的计时函数,程序开始之前记录一次时间,结束的时候记录一次时间,两次相减不就是你的函数的执行时间吗?追问

c语言中呢

追答

time.h c语言也能用
unsigned long long貌似c语言也支持,你试试,我现在的电脑没有c编译器

追问

我在VC中运行的,说 long 后面接long是错的,显示‘error C2632: 'long' followed by 'long' is illegal’

追答

那就unsigned long是最大了

关于计时请参看:
http://msdn.microsoft.com/en-us/library/4e2ess30(v=vs.71).aspx

参考资料:http://msdn.microsoft.com/en-us/library/4e2ess30(v=vs.71).aspx

追问

#include
long Fn(int n);
void main()
int i;
int m=sizeof(unsigned long);
for(i=1;;i++)
if(Fn(i)>=m)
printf("最大的n是%d,第%d个Fibonacci数不超过计算机所能表示的最大整数",i,i);


long Fn(int n)

if(n==1)
return 0;
else if(n==2)
return 1;
else return Fn(n-1)+Fn(n-2);


这个代码把所有的n的情况都输出了,连n=1时是都输出了。。。。看看问题所在

追答

LaceTao说的是C++的库

#include
#include
#include
#include

unsigned long Fn(int n);
int _fnlen = 100;
unsigned long *_fn;
void main()

int i;
unsigned long m=~0; // 其实想让你先看一下sizeof(unsigned long)是多少,比方说是4,那么这里直接写:unsigned long m=0xffffffff,就是8个f
_fn = new unsigned long[_fnlen];

clock_t start = clock();
for(i=1;;i++)
if(Fn(i + 1)<=Fn(i))
printf("最大的n是%d,第%d个Fibonacci数不超过计算机所能表示的最大整数",i,i);
printf("执行时间:%d", clock() - start);
break;


delete _fn;

long Fn(int n)

if (_fnlen <= n)
unsigned long *pl = new unsigned long[_fnlen * 2];
memset(*pl, sizeof(unsigned long) * _fnlen * 2, 0);
memcpy(pl, _fn, sizeof(unsigned long) * _fnlen);
_fnlen *= 2;
delete _fn;
_fn = pl;

if (_fn[n]) return _fn[n];
if(n==1)
_fn[n] = 0;
else if(n==2)
_fn[n] = 1;
else _fn[n] = Fn(n-1)+Fn(n-2);
return _fn[n];



我这没有c编译器,不敢保证一点没错,但思路没问题,你自己编译调试一下

参考技术A 泛型算法里面有一个limit.h
这个有一个宏标识了各种类型的最大值和最小值,楼主可以看看这个limit文件,一般来说根据操作系统来的,32位的和16位或者64位的int型肯定不一样的,看这个limit.h文件就可以了知道了。追问

怎么用?具体怎么求最大整数?

参考技术B 应该看编译器支持的最大类型是多少
在VC里
unsigned long long 和 unsigned long都是4个字节
可用下边这个求出这个最大数
unsigned long long max = ~0;
参考技术C 难道你要的是这个?
unsigned long long max_num = (unsigned long long) -1;
参考技术D 我想说,你是不是民大的呀

大整数求和

大整数求和

  摘要:对于一些大整数,如果超出电脑整型数所能表示的最大范围,应该怎么计算加法呢?我们可以利用字符串进行求和,具体代码如下:

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 string Add(string &str1, string &str2);
 5 int main()
 6 {
 7     string str1, str2;
 8     cin >> str1 >> str2;
 9     cout << Add(str1, str2) << endl;
10  }
11 
12 string Add(string & str1, string & str2)
13 {
14     int flag = 0;  // 进位标记
15     int i = 0; // 位数
16     int n = str1.size();
17     int m = str2.size();
18     // 整数是从最低位开始相加,所以先将字符串反序
19     reverse(str1.begin(), str1.end());
20     reverse(str2.begin(), str2.end());
21     string res = "";// 存放结果的串
22     while (i < n && i < m)
23     {        
24         res+=(((str1[i] - \'0\') + (str2[i] - \'0\') + flag) % 10 + \'0\');// 计算第i位的值
25         flag = ((str1[i] - \'0\') + (str2[i] - \'0\') + flag) / 10;    // 计算第i位的进位
26         i++;
27     }
28     // 如果str1表示的整数位数更多,计算大整数str1余下的部分
29     while (i < n)
30     {    
31         res+= (((str1[i] - \'0\') + flag) % 10 + \'0\');// 计算第i位的值
32         flag = ((str1[i] - \'0\') + flag) / 10;    // 计算第i位的进位
33         i++;
34     }
35     // 如果str2表示的整数位数更多,计算大整数str2余下的部分
36     while (i < m)
37     {        
38         res+= (((str2[i] - \'0\') + flag) % 10 + \'0\');// 计算第i位的值
39         flag = ((str2[i] - \'0\') + flag) / 10;    // 计算第i位的进位
40         i++;
41     }
42     // 最高位是否有进位,设置最高位的值44     if (flag == 1)
45         res+= \'1\';
46     // 反序结果串,结果即为所求
47     reverse(res.begin(), res.end());
48     return res;
49 }

 

 运行结果如下:

 

 

以上是关于c语言怎么求当前电脑能表示的最大整型数?的主要内容,如果未能解决你的问题,请参考以下文章

C语言将数组转换成一个整型数

C里面怎么把字符串转成数字

c语言 从键盘上读入一个整型数,将其转化成字符串并输出。例如:输入123,则转换为字符串“123

c语言 与7无关的数 急

C语言 整型是啥?就是整数吗?

C语言求两个整型数据的“&”运算结果,打印输出运算结果的二进制位模式。