@Anvario0

Из-за чего программа на C выдаёт неправильный ответ?

Задание: Некоторое натуральное число заканчивается на двойку. Если ее переставить на первое место, то число удвоится. Какое минимальное число было изначально?
#include <stdio.h>

int main() {
	int a = 1;
	int proverka = 0;
	while (1)
	{
		if (a % 10 == 2) {
			int r = a; //Сохраняем начально значение a
			int x = a;
			int count = 0;
			while (x > 0) {
				x /= 10;
				count += 1;  //Считаем, сколько у числа разрядов
			}
			a /= 10;
			a = a + 2 * pow(10, (count - 1));
			if (a / r == 2) {
				printf("r = %d\n", r);
				printf("a = %d\n\n", a);
				proverka = 1;
			}
			a = r;
		}
		a++;

		if (proverka == 1) {
			break;
		}
	}
}


Ответ, который выдаёт программа:
r = 102
a = 210
Ответ, очевидно, неверный, ведь 102 * 2 != 210.
Я достаточно долго над ней просидел, но всё не могу понять в чём ошибка в коде. Буду признателен, если поможете
  • Вопрос задан
  • 81 просмотр
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Потому что целочисленное деление: a / r дает в результате 2 без остатка. Вам нужно преобразовывать в числа с плавающей точкой, выполнять деление с плавающей точкой и получать остаток с помощью modf.

Еще пара замечаний:
1. явно ведь ваш алгоритм начинается с 12, т.к. это первое число с более 1 цифрой в составе, у которого младшая цифра двойка. Так что все что меньша 12 нет смысла перебирать.
2. Нет смысла увеличивать а на 1 - увеличивайте сразу на 10, т.е. к следующему варианту с двойкой в конце, зачем перебирать варианты, которые вы пропустите. Кроме того в этом случае count можно не расчитывать так как делаете сейчас, а просто добавлять 1 каждые 10 итераций.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы