在32位系统上存储2个以上的电源31

时间:2011-10-04 16:42:17

标签: c math

我必须编写一个程序,可以计算2 power 2010的幂并找到数字的总和。例如:

if `2 power 12 => gives 4096 . So 4+0+9+6 = 19 . 

现在我需要为2 power 2010.

找到相同的内容

请帮助我理解。

6 个答案:

答案 0 :(得分:37)

这是让你入门的东西:

char buf[2010]; // 2^2010 < 10^2010 by a huge margin, so buffer size is safe
snprintf(buf, sizeof buf, "%.0Lf", 0x1p2010L);

答案 1 :(得分:18)

您必须使用提供无限长整数类型的库(请参阅http://en.wikipedia.org/wiki/Bignum),或实现不需要它们的解决方案(例如,使用数字数组并自行对阵列执行功率计算,在你的情况下,它可以像在循环中添加一样简单)。因为这是家庭作业,可能是后者。

答案 2 :(得分:9)

知道2 ^ 32,你怎么用笔和纸计算2 ^ 33?

2^32 is 4294967296

4294967296
*        2
----------
8589934592

8589934592 is 2^33; sum of digits is 8+5+8+9+...+9+2 (62)

请注意,2 ^ 2011是一个超过600位的数字:计算机没有那么多

答案 3 :(得分:7)

GMP可能是最好,最快的免费多架构库。它为这种计算提供了坚实的基础,不仅包括加法,还包括从字符串解析,乘法,除法,科学操作等。

关于算法本身的文献,我强烈推荐The Art of Computer Programming, Volume 2: Seminumerical Algorithms by Donald Knuth。许多人认为本书是该主题的最佳单一参考。本书从头开始解释了如何在只能进行32位运算的机器上进行这种运算。

如果您想在不使用任何工具的情况下从头开始实施此计算,则以下代码块要求仅需要提供以下其他方法:

unsigned int divModByTen(unsigned int *num, unsigned int length);
bool isZero(unsigned int *num, unsigned int length);

divModByTen应该将内存中的replace num除以num / 10的值,并返回余数。除非使用库,否则实现将需要一些努力。 isZero只检查内存中的数字是否全为零。获得这些后,我们可以使用以下代码示例:

unsigned int div10;
int decimalDigitSum;

unsigned int hugeNumber[64];
memset(twoPow2010, 0, sizeof(twoPow2010));
twoPow2010[63] = 0x4000000;
// at this point, twoPow2010 is 2^2010 encoded in binary stored in memory

decimalDigitSum = 0;
while (!izZero(hugeNumber, 64)) {
    mod10 = divModByTen(&hugeNumber[0], 64);
    decimalDigitSum += mod10;
}

printf("Digit Sum:%d", decimalDigitSum);

答案 4 :(得分:6)

在Delphi中只需几行代码......:)

因此 c 必须相同或更短。

function PowerOf2(exp: integer): string;
var
  n     : integer;
  Digit : integer;
begin
  result := '1';
  while exp <> 0 do
  begin
    Digit := 0;
    for n := Length(result) downto 1 do
    begin
      Digit := (ord(result[n]) - ord('0')) * 2 + Digit div 10;
      result[n] := char(Digit mod 10 + ord('0'))
    end;
    if Digit > 9 then
      result := '1' + result;
    dec(exp);
  end;
end;

- - - - - - - - 编辑

这是1对1 c#版本。

string PowerOf2(int exp)
{
    int n, digit;
    StringBuilder result = new StringBuilder("1");
    while (exp != 0)
    {
        digit = 0;
        for (n = result.Length; n >= 1; n--)
        {
            digit = (result[n-1] - '0') * 2 + digit / 10;
            result[n-1] = Convert.ToChar(digit % 10 + '0');
        }
        if (digit > 9)
        {
            result = new StringBuilder("1" + result.ToString());
        }
        exp--;
    }
    return result.ToString();
}

int Sum(string s)
{
    int sum = 0;
    for (int i = 0; i < s.Length; i++)
    {
        sum += s[i] - '0';
    }
    return sum;
}

for (int i = 1; i < 20; i++)
{
    string s1s = PowerOf2(i);
    int sum = Sum(s1s);
     Console.WriteLine(s1s + " --> " + sum);
}

答案 5 :(得分:2)

以下是如何计算和打印2 2010

#include <stdio.h>
#include <string.h>

void AddNumbers(char* dst, const char* src)
{
  char ddigit;
  char carry = 0;

  while ((ddigit = *dst) != '\0')
  {
    char sdigit = '0';

    if (*src != '\0')
    {
      sdigit = *src++;
    }

    ddigit += sdigit - '0' + carry;

    if (ddigit > '9')
    {
      ddigit -= 10;
      carry = 1;
    }
    else
    {
      carry = 0;
    }

    *dst++ = ddigit;
  }
}

void ReverseString(char* s)
{
  size_t i, n = strlen(s);

  for (i = 0; i < n / 2; i++)
  {
    char t = s[i];
    s[i] = s[n - 1 - i];
    s[n - 1 - i] = t;
  }
}

int main(void)
{
  char result[607], tmp[sizeof(result)];
  int i;

  memset (result, '0', sizeof(result));
  result[0] = '1';
  result[sizeof(result) - 1] = '\0';

  for (i = 0; i < 2010; i++)
  {
    memcpy(tmp, result, sizeof(result));
    AddNumbers(result, tmp);
  }

  ReverseString(result);
  printf("%s\n", result);

  return 0;
}

您现在可以总结各个数字。