C++ 如何在C++;

C++ 如何在C++;,c++,biginteger,limits,C++,Biginteger,Limits,我有这个密码 #include <iostream> using namespace std; int main(int argc,char **argv) { unsigned long long num1 = 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

我有这个密码

#include <iostream>

using namespace std;

int main(int argc,char **argv) {

    unsigned long long num1 = 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999995LL;
    unsigned long long num2 = 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999996LL;
    unsigned long long num3 = 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999997LL;
    unsigned long long num4 = 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999998LL;
    unsigned long long num5 = 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999LL;

    cout << (unsigned long long)(num1 * num2 * num3 * num4 * num5) << endl;
    return 0;
}

unsigned int表示系统字。今天,该单词的最大值为2^32-1或2^64-1,这取决于您的系统是32位还是64位。你太过分了

您必须编写一个bignum类或使用一个“网外”类


<>你为什么要做这个问题?< /P> < P>这些数字不适合任何C++数据类型。如果您只想打印它们,请将数字存储在字符串中。如果你想对它进行数学运算,找到一个任意精度的数学库并使用它。

你的结果比long-long类型大-你需要查看一个或任意精度的库,类似于

你得到的答案,18446744073709551496,是因为你的999…9在分配给long-long类型时被截断,加上多个操作溢出。它是确定性的,但实际上只是位的随机集合

如果您希望在代码中包含这么大的文本,那么必须将它们作为字符串文本输入,并将它们加载到某种类型的BigInt类中。现在没有办法在源代码中表达这么大的整数文本(尽管C++0x有望解决这一不足)

如果您正在使用库,请查看
bigingerutils.hh
中的
stringToBigUnsigned
函数,该函数用于从字符串构建大整数

#include "BigUnsigned.hh"
#include "BigIntegerUtils.hh"     

 BigUnsigned  num1 = stringToBigUnsigned (
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999995"
    );

你想做什么?你了解二进制数和十进制数的基本知识吗?为什么8位只保存值0到255,12位0到4095,等等?您感兴趣的数字需要多少位?或者更好,你对创造一个多大的数字感兴趣?你是用9来增加数字吗?那十六进制0xF呢。。。相反如果您想要最大的无符号数(在一种标准整数类型内),为什么不:

无符号长a、b

a=-1//混合使用有符号和无符号似乎是错误的,但它是有效的,在存储之前将数字转换为无符号

b=0;b--//做与上面相同的事情

你真的需要那个级别的精度吗?您是否意识到乘法可能需要两倍于每个操作数大小的结果?0xFF*0xFF=0xFE01,如果在本例中使用的是8位整数,则无法进行计算。当您继续乘以0xFF*0xFF*0xFF=0xFD02FF时,情况只会变得更糟

你想做什么


看看你的回答:

我以前没有见过欧拉8号。听起来是个不错的面试问题,因为只需要几行代码就可以解决


你的其他回应:

数字

很可能是因为我们有10个手指(也许还有10个脚趾),我们是在“10根”的环境下长大的。我们的时钟大部分是以60为基数的,但它与以10为基数的时钟混在一起,使它更容易混淆。无论如何,基数10表示每个数字占位符有10个唯一数字中的一个,当该位置达到最大值时,将滚动到下一个位置。这些都是小学的东西

000
001
002
003

008
009
010
011
012
...

查看最右边的数字是如何包含10个符号的(0,1,2,3,4,5,6,7,8,9),当它到达最后一个符号时,它会重新开始,左边的一个符号会增加1。此规则适用于所有基本编号系统

除了只有两个符号0和1外,基数2也是如此

000
001
010
011
100
101
...

八进制也是如此,但有8个符号(0,1,2,3,4,5,6,7)

000
001
002
003
004
005
006
007
010
011
012
013
...

十六进制16个符号(0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f)也是如此

000
001
002
003
004
005
006
007
008
009
00a
00b
00c
00d
00e
00f
010
011
012
013
...

我正要探讨为什么在计算机中使用二进制而不是其他基数(比如10)。底线是很容易有两种状态打开或关闭,或高和低。两个状态类似于基2中的两个符号1和0。试图使电子器件在可用电压范围内调谐到两种以上的状态是困难的,至少过去是这样,保持接近零伏或高于一些少量的伏相对容易,因此数字电子器件使用两种状态,二进制

即使是简单的二进制任务也是冗长的,简单的二年级数学仍然有很多1和0。八进制之所以流行,是因为它允许你以三位为一组思考,你可以使用我们熟悉的数字0,1,2,3,4,5,6,7。但是四人组是2的另一个幂,它给人类带来了比八进制多得多的精神计算能力,十六进制是基于4位的,也是2的幂。我们不得不在从传统阿拉伯语的10进制借来的10进制中添加更多符号,因此使用了字母表的前6个。八进制是很少使用的,你可以告诉一些人年龄,如果他们认为八进制而不是十六进制。(我来自十六进制一代,但与八进制一代的人一起工作,他们与十六进制斗争,因为他们无法在头脑中从八进制到二进制再到十六进制)

在计算机中以10为基数就像人类以十六进制表示的一般思维。计算机不做基数10(对于懒惰的人来说,他们过去做bcd很好),它们做基数2。计算机中的十进制数1234实际上是0x4D2或0B010011010。这是一个值,假设您想将1234加上您需要的其他数字,该值与符号1、2、3和4无关。但要在stackoverflow上发布此答案,我们不使用ASCII中的数字,因此ASCII中的1234是0x31、0x32、0x33、0x34,这对于您的euler解决方案很重要,假设1000位数字作为ASCII字符串提供,它必须是,或者您必须将其从二进制转换为ascii,因为问题是以10为基数的问题,而不是定义为以2为基数的问题

所以b
#include "BigUnsigned.hh"
#include "BigIntegerUtils.hh"     

 BigUnsigned  num1 = stringToBigUnsigned (
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999995"
    );
#include <cmath>
#include <iostream>
using namespace std;
int main()
{
  unsigned int nd, nz;   
  unsigned char *ca;   
  unsigned int j, n=50, q, temp;
  int i;
  double p;
    p = 0.0;
    for(j = 2; j <= n; j++)
    {
      p += log10((double)j);  
    }
    nd = (int)p + 1;

    ca = new unsigned char[nd+1];
    if (!ca)
    {
      cout << "Could not allocate memory!!!";
      exit(0);
    }
    for (i = 1; (unsigned)i < nd; i++)
    {
      ca[i] = 0;
    }
    ca[0] = 1;

    p = 0.0;
    for (j = 2; j <= n; j++)
    {
      p += log10((double)j);   
      nz = (int)p + 1;        
      q = 0;                  
      for (i = 0;(unsigned) i <= nz; i++)
      {
        temp = (ca[i] * j) + q;
        q = (temp / 10);
        ca[i] = (char)(temp % 10);
      }
    }

    cout << "\nThe Factorial of " << n << " is: ";
    for( i = nd - 1; i >= 0; i--)
    {
      cout << (int)ca[i];
    }
  //  delete []ca;    
  return 0;
}
#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>

int main()
{
   using namespace boost::multiprecision;
// Repeat at arbitrary precision:
   cpp_int u = 1;
   for(unsigned i = 1; i <= 100; ++i)
      u *= i;

   // prints 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 (i.e. 100!)
   std::cout << u << std::endl;

   return 0;
}