@stividjon

Задача на C#. Как мне найти степень числа(без Math.Pow)?

int a = 2;
int result = 64;


Мне нужно найти степень числа 2(int a) чтобы по результату(result) было верно. Т.е. консоль должен вывести число 6. Только реализовать эту программу нужно без Math.Pow
  • Вопрос задан
  • 447 просмотров
Решения вопроса 2
Просто напишу код целочисленного логарифма по основанию 2, может кому пригодится
using System;
class Log2Test {
  static uint pop(uint x)
  {
      uint n;
      n = (x >> 1) & 0x77777777;
      x = x - n;
      n = (n >> 1) & 0x77777777;
      x = x - n;
      n = (n >> 1) & 0x77777777;
      x = x - n;
      x = (x + (x >> 4)) & 0x0f0f0f0f;
      x = x * 0x01010101;
      return x >> 24;
  }
  static uint log2(uint x)
  {
      x = x | (x >> 1);
      x = x | (x >> 2);
      x = x | (x >> 4);
      x = x | (x >> 8);
      x = x | (x >> 16);
      return pop(x)-1;
  }
  static void Main() {
    for(int i = 0; i < 31; i++)
    {
        uint x = 2U << i;
        Console.WriteLine("log2({0})={1}", x, log2(x));
    }
  }
}
Ответ написан
Комментировать
@stividjon Автор вопроса
int a = 2;
int result = 64;
int power = 0;

while( result != 1 )
{
result /= a;
power++;
}
Console.WriteLine(power);
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@Voland69
Так как в вопросе Math.Pow использовать запрещено, но о других методах речи не шло, можно определить логарифм по произвольному основанию используя натуральный логарифм и школьную формулу.
int a = 2;
int b = 64;
var result = Math.Log(b) / Math.Log(a);  // 6
Ответ написан
Напишите алгоритм, как бы вы это сделали вручную, а потом переведите его в код.
Ответ написан
Комментировать
GavriKos
@GavriKos
Ну берете математическое определение степени, главу про циклы, и реализуете
Ответ написан
Комментировать
Griboks
@Griboks Куратор тега C#
Умножение/деление на 2 эквивалентно бинарному сдвигу (>>, <<) на 1. Сколько раз пришлось сдвинуть 64 вправо, чтобы получить 1, таков и ответ.
64 >> 6 = 1 => 2^6=64 <=> 1 << 6 = 64

p.s.
#Программистам не нужна математика.
Ответ написан
Комментировать
@WAR_VIK
Можно так:
int num = 2, n = num, res = 64, pow = 1;
while(num < res) {
  num *= n; ++pow;
}
Console.WriteLine(pow);
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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