在C中查找5个连续整数的乘积

时间:2014-04-08 22:05:53

标签: c for-loop

我正在尝试计算5个连续整数的乘积,但结果完全错了。我认为我的逻辑是正确的,但为什么它给我一个不真实的数字:344362200

序列号从1到10,代码在下面(仅用于测试):

void problem8()
{
    char *input = "123456789";
    char c;
    int step = 5, i = 0, prod = 0, temp = 1;
    for (; i < step; i++)
    {
        temp *= *(input + i);
        printf("%d\n", temp);
    }
}

输出真的很奇怪!在第一个循环中,结果是42 @@,而它应该是1和1。我从*(输入+ 0)或1 2 4等检查了个别结果,这是正确的。但产品错了。

3 个答案:

答案 0 :(得分:4)

您需要区分数字的代码('0'为48,'1'为49等),数字为1,2等。第一个应该是49迭代;的确,我得到了:

49
2450
124950
6497400
344362200

如果你想要前5个阶乘,你需要使用temp *= input[i] - '0';(其中input[i]*(input + i)更整洁,IMNSHO)。

我给出的代码对代码集有效,例如ISO 8859-1,以及UTF-8和许多其他相关代码集。但它们对EBCDIC无效。

答案 1 :(得分:2)

问题是您正在将char转换为int,而不考虑ASCII表中的ASCII偏移。对于ASCII,整数从十六进制0x30开始。

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

int multiplyFiveSingleDigitNumbersInAString (const char* input, size_t inputLength);

int main(void) {
   int tmp = 0;
   const char* buf = "12345"; /* Create null-terminated string */
   tmp = multiplyFiveSingleDigitNumbersInAString(buf, strlen(buf));
   printf("Result of calculation for string %s is %d\n", buf, tmp);
   return 0;
}

int multiplyFiveSingleDigitNumbersInAString (const char* input, size_t inputLength) {
   if (inputLength != 5) {
      printf("Wrong string length (%d), should be %d\n", (int)inputLength, 5);
      return 0;
   }
   int i;
   int multiSum = 1;
   for (i=0; i<inputLength; i++) {
      multiSum *= (int)input[i] - 0x30;
   }
   return multiSum;
}

<强>参考

  1. ASCII表,已访问2014-04-08,<http://www.asciitable.com/>

答案 2 :(得分:1)

IMO,其他答案接近这一点。当你想要整数时,不要使用字符。只需改变

char *input = "123456789";

int input = { 1, 2, 3, 4, 5 };

您的代码将有效。

P.S。这是解决实际问题的方法:

char digits[] = "731...";

int main(void)
{
    int max = 0;

    for (int len = sizeof digits - 1, i = 0; i < len - 4; i++)
    {
        int prod = 1;
        for (int j = 0; j < 5; j++)
            prod *= digits[i + j] - '0';
        if (max < prod) max = prod;
    }
    printf("%d\n", max);

    return 0;
}