我是C编程的新手(我有一些基于vb.NET编程的基本经验),我试图为Project Euler Problem#1编写一个程序。 https://projecteuler.net/problem=1
挑战要求程序员找到低于1000的3或5(含)的所有倍数的总和(我使用intInput来允许用户输入一个整数代替1000)。
我的当前解决方案接受输入,并将其递减1直到(intInput - n)%3 = 0,即,直到找到输入整数下的下一个最接近的3的倍数。
程序然后循环遍历从1到((intInput - n)/ 3)的所有整数,将每个整数添加到前一个整数的总和,只要当前整数不是5的倍数,在这种情况下,它被跳过了。
然后将得到的和存储在intThreeMultiplier中。
然后重复上面的过程,使用5代替3,在intInput下找到5的最大倍数,然后循环遍历整数1到((intInput - n)/ 5),而不是这次跳过3的倍数,并将总和存储在intFiveMultiplier中。
然后通过sum =(3 * intThreeMultiplier)+(5 * intFiveMultiplier)计算输出和。
每当我编译并运行我的代码时,允许用户输入一个整数,然后程序崩溃。我已经确定原因与第一个For循环有关,但我无法弄清楚它是什么。
我已经在违规代码片段之后注释了所有内容。
#include <stdio.h>
#include <stdlib.h>
void main()
{
int intInput = 0; /*Holds the target number (1000 in the challenge statement.)*/
int n = 0;
int count = 0;
int intThreeMultiplier = 1;
int intFiveMultiplier = 1;
printf("Please enter a positive integer.\n");
scanf("%d",intInput);
for( ; (((intInput - n) % 3) != 0) ; n++)
{}
/*for(; count <= ((intInput - n) / 3); count++)
{
if ((count % 5) != 0)
{
intThreeMultiplier += count;
}
}
count = 0;
for(n = 0 ; ((intInput - n) % 5) != 0 ; n++)
{}
for(; count <= ((intInput - n) / 5) ; count++)
{
intFiveMultiplier += count;
}
int sum = (3 * intThreeMultiplier) + (5 * intFiveMultiplier);
printf("The sume of all multiples of 3 or 5 (inclusively) under %d is %d.",intInput, sum);*/
}
这是我第一次在StackOverflow上发帖,所以如果我违反任何提出问题的规则,我会提前道歉,并希望得到有关此问题的任何反馈。
此外,我对编码实践的任何建议或我用C做过的任何新手错误都非常开放。
谢谢!
答案 0 :(得分:1)
scanf("%d",intInput);
可能是
scanf("%d", &intInput); // note the ampersand
scanf
需要地址是要存储内容的变量。 Why scanf must take the address of operator
仅用于调试,打印输入以验证输入是否正确接受,如
printf("intInput = %d\n", intInput);
答案 1 :(得分:0)
输入intInput
时首先需要使用:
scanf("%d", &intInput);
因为scanf()
需要作为指向变量的指针的参数。你这样做是通过把&amp;在你的int之前签名。
另外我认为你应该仔细检查你的算法,因为你不止一次总结了一些数字。 :)