Member 14231773 Ответов: 3

Как я могу написать одну и ту же функцию, используя ровно один цикл


<pre>static void fun(int x) {
int a, b, c, d;
d = 1;
for (a = 1; a <= x; a++) {
b = a;
c = 1;
while (b > 0) {
c &= b % 2;
b /= 2;
}
d += c;
}
 System.out.println(d);
}


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

Я попытался изменить цикл while на цикл if, а затем после того, как цикл назначит новые значения переменным, я попытался использовать continue; но результаты были совершенно другими. Я также попытался избавиться от цикла for и увеличить значение a без цикла, но результат также был другим.

3 Ответов

Рейтинг:
2

CPallini

static void very_fun(int x)
{
  int b = 1, c = 1;
  for (int a = 1; a <= x; a += b)
  {
    ++c;
    b *= 2;
  }
  System.out.println(c);
}


Рейтинг:
2

#realJSOP

Вам нужна рекурсивная функция.

рекурсивные функции java в DuckDuckGo[^]


Рейтинг:
0

Patrice T

Цитата:
Я пытался использовать continue; но результаты были совершенно другими.

Попытка случайных изменений в коде-плохая идея.

Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.
static void fun(int x) {
	int a, b, c, d;
	d = 1;
	for (a = 1; a <= x; a++) {
		b = a;
		c = 1;
		while (b > 0) {
			c &= b % 2;
			b /= 2;
		}
		d += c;
	}
	System.out.println(d);
}

Стиль отступа - Википедия[^]

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]
Цитата:
Как я могу написать одну и ту же функцию, используя ровно один цикл

При первом чтении это выглядит так, как будто нужны 2 цикла, так что если вам нужно сохранить его в 1 функции, вам нужно полностью понять, что делает этот код.

Этот
c &= b % 2;
b /= 2;

говорит о том, что код возится с двоичной формой b

первое, что нужно сделать, это запустить функцию с помощью x=1, 2, 3, 4 ... 16
обратите внимание совпадениям и бинарными х
x binary result
  1    1
  2   10
  3   11
...

затем вы должны найти причину, по которой результат меняется, это понимание может привести к упрощению и удалению цикла.
В противном случае, решение CPallini-это просто магия, и вы ничего не узнаете.