2014-04-08 40 views
-1

我试图计算5个连续整数的乘积,但结果完全错误。我觉得我的逻辑是正确的,但为什么它让我看到一个虚幻的数字:344362200在C中查找5个连续整数的乘积C

序列号是从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等检查了个别结果,这是正确的。但产品是错误的。

+2

那么你去了,答案是42.不是它应该是49吗?这是如果我编译你的代码。 – this

+4

尝试'input [i] - '0''而不是'*(input + i)'。 – zwol

回答

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。

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年4月8日,<http://www.asciitable.com/>
+0

+1但是...我想知道设计决定在函数名称中体现长度,特别是给出使用长度为9的字符串而没有不良影响的示例数据。函数'multiplySingleDigitNumbersInAString(const char * input,size_t len)'是有意义的; 'multiplySingleDigitNumbersInAString(const char * input)'也取整个字符串。你应该使用'0'代替0x30;那么你的代码也可以在EBCDIC机器上工作。如果你正在检查长度,你应该检查'数字'实际上是数字:'if(!isdigit((unsigned char)input [i]))return 0;'。 –

+0

此外,错误应打印到标准错误,而不是标准输出。功能是否应该打印是有争议的;如果它在静默中返回一个明确的错误(-1不能合法,0可以是其中一个数字为零)会更好。调用代码然后可以报告问题。 –

+0

OP从未提及过字符串......问题涉及“5个连续的整数”。奇怪的是,人们在代码中保留*一个错误的东西*并改变其余部分,而不是相反。看到我的答案是一个更明智的方法。 –

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; 
} 
+0

如果输入是1000长,你将如何把它放入一个int数组?那么你可以看到它在这[链接](http://projecteuler.net/problem=8) –

+0

@TrungBún如果你想要一个具体问题的答案,问** **问题,不要添加它作为评论。考虑到你的* new *问题,把数字放在一个字符串中比较容易一些,然后你按照你的意思减去'0',但是把它转换成一个int数组也很简单emacs或vi,或者使用Perl或类似的脚本。 –

+0

我很感谢你的帮助!但我更愿意以我的想法去做!如果我失败了,也许我会在其他地方创建一个新帖子或发表评论以寻求帮助。你看到了吗?我的代码正在工作!如果我不这样做我的方式,那么我怎么知道从一个char转换为一个int只是通过:char - '0'?我怎么知道我输出的数字49是ASCII字符的十位数?这将在未来帮助我。不过谢谢你! :) –