xTMx9 Ответов: 2

Не могу получить сумму кратных 2 числам


Я пытаюсь получить сумму кратных 2 числам, заданным пользователем, но полученное число неверно,вот пример того, что я пытаюсь сделать:
Попытка найти сумму кратных 19 или 17 под 747
Например, если мы перечислим все натуральные числа ниже 10, кратные 3 или 5, мы получим 3, 5, 6 и 9. Сумма этих кратных равна 23.
Может быть,что-то не так с моей логикой, но я думаю, что 2 цикла while запускаются еще раз, прежде чем сломаться.Итак, как я могу заставить циклы while выйти до того, как сумма первых кратных будет больше максимального числа, заданного пользователем?

Что я уже пробовал:

#include <stdio.h>
void main()
{
	int n1,n2,n3, inc1,inc2,sumt,sum1,sum2,t1,t2;
	inc1 = 1;
	inc2 = 1;
	sum1 = 0;
	sum2 = 0;
	sumt = 0;
	t1 = 0;
	t2 = 0;
	printf("type first number: ");
	scanf("%d", &n1);
	printf("\ntype second number: ");
	scanf("%d",&n2);
	printf("\ntype max number: ");
	scanf("%d", &n3);
	
	while (sum1 < n3)
	{
		t1 = n1*inc1;	
		sum1 = sum1 + t1;
			inc1++;
			
			}
	while (sum2 < n3)
	{
		t2 = n2*inc2;
		sum2 = sum2 + t2;
		inc2++;
		
	}
	sumt = sum1 + sum2;
	printf("\n the sum of the multiples %d", sumt);

	getchar();
	getchar();
}

Richard MacCutchan

Я пробовал ваш код с выбором значений, и он всегда дает правильный ответ. Пожалуйста, покажите значения, которые вы вводите, и результат, который вы видите.

2 Ответов

Рейтинг:
2

OriginalGriff

В этот момент отладчик становится действительно удобным! :смеяться:
Поставьте точку останова на линии:

while (sum1 < n3)
и запустите свою программу. Введите номера образцов как 3, 5 и 10, как в вашем образце.
Шагните вперед, глядя на содержимое t1 и sum1, и он будет выполняться 3 раза: 3*1, 3*2 и 3*3, оставляя вас с общей суммой в sum1 18. И это правильно: 3 + 6 + 9 = 18.
Итак, первый цикл выглядит так, как будто он работает.
Время для второго цикла...
Сделайте то же самое с отладчиком, и он выполнит сколько раз? Дважды. Один раз для 5*1 и один раз для 5*2, что дает вам в общей сложности 15 в сум2.
Это неправильно - он больше, чем должен быть, потому что он включал 10 в общую сумму.

Так почему же он сделал это, когда первый дал правильный результат? Ответ прост: удача. Чистая, слепая удача!
Почему удача? Потому что обе петли ошибочны, и обе петли дадут одно и то же неправильное число.
Почему? Просто: "конечный тест" неверен. Вы не останавливаетесь, когда получаете кратное число, которое больше предельного числа, вы останавливаетесь, когда весь это больше, чем предел.
Менять пока в:
while (n1 * inc1 < n3)
и
while (n2 * inc2 < n3)
и вы получите правильный результат.
Но ... есть "лучший способ", который вообще не предполагает умножения. Можете ли вы понять, что это такое?


Рейтинг:
0

Patrice T

Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Проверьте постановку задачи:
n3 является максимальным для кратных n1 и n2 или максимум суммы ?
Для 3 и 5 под 20, обратите внимание на то, что 15 кратно обоим и должно быть подсчитано только один раз.
Используйте отладчик, чтобы проверить, что ваш код делает то, что требуется.