我正在尝试计算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等检查了个别结果,这是正确的。但产品错了。
答案 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;
}
<强>参考强>
<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;
}