【问题标题】:max number inputted by user用户输入的最大数量
【发布时间】:2013-12-17 02:36:23
【问题描述】:

我制作了这个简单的程序来计算给定数字的阶乘。对于数字 n,它是

n * (n-1) * (n-2) ....* (n-(n-1))

代码如下:

#include<stdio.h>
int main()
{
int i,n;
long fact=1;
printf("Enter a number: \t")
scanf("%d",&n);
for(i=0; i<=(n-1); i++)
{    if( n==0 || n==1)
      fact =1;
      else
      fact*=i;
 }
 return 0;
 }

我意识到当用户输入一个大数字时程序会崩溃。(这是合乎逻辑的)

  1. 我想要这个数字的限制。 (即用户可以输入的最大数量而不会使程序崩溃。)
  2. 有没有办法增加这个数字?

感谢任何帮助。

【问题讨论】:

  • 您说的崩溃是对的。可以通过n! 是否小于表示的最大可能数来确定限制。您应该使用浮点表示来增加这个数字
  • 您应该使用 limits.h 库并使用 INT_MAX 检查您的阶乘 请阅读此链接 [limits.h][1]。 [1]:publib.boulder.ibm.com/infocenter/aix/v7r1/index.jsp?topic=/…
  • 无论如何这都不应该“崩溃”。整数溢出不会导致 C 程序崩溃。
  • @Andrey 我对此一无所知,但我用大数字进行了尝试,窗口变为非活动状态且无响应。 (我使用的是 Turbo C++)。
  • 如果你让它运行足够长的时间,它就会返回。它正在变得不活跃,因为它正在运行大量的乘法。它没有“崩溃”。

标签: c for-loop long-integer


【解决方案1】:

一般在 c 和 c++ 中,最低要求是

signed char: -2^07+1 to +2^07-1
short:       -2^15+1 to +2^15-1
int:         -2^15+1 to +2^15-1
long:        -2^31+1 to +2^31-1
long long:   -2^63+1 to +2^63-1

所以要找出可以输入的数字的限制,您必须寻找两个数字,其阶乘刚好低于和高于 long 的范围,即在最小情况下为 2^31 - 1

要增加此限制,您可以考虑使用long long

或者unsigned long long

【讨论】:

    【解决方案2】:

    尝试使用 scanf("%ld",&n)

    或 scanf("%lld",&n),也可以使用 printf 或者可能使用字符串和数组来处理大数字

    【讨论】:

    • 问题不在于 n。因为 n 与事实相比太小了。
    • 这就是我所说的,当我说你应该使用字符串作为输入,然后将它们转换为 int 数组时,如果你不能,你可以在网络上找到处理这些东西的算法写下你拥有的
    • 这是我用 C++ 编写的代码,我用 C 编写过,但找不到 dropbox.com/s/tutqavekvywbbh1/BigNumbers.rar
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2015-07-16
    • 2015-12-30
    • 2014-08-03
    • 2022-11-19
    • 2016-03-08
    • 2021-06-01
    • 2011-06-19
    相关资源
    最近更新 更多