Возведение чисел в квадрат при выводе цикла

#c

#c

Вопрос:

У меня здесь есть этот код, который должен выводить все возведенные в квадрат числа до n . Например, если вы введете 10 , это отобразится 1 4 9 . Проблема в том, что когда я ввожу 25, он должен был выдавать выходные 1 4 9 16 25 данные. Но вместо этого он показывает 1 4 9 16 24

 #include <iostream>
using namespace std;
#include <cmath>

  int main(){
    int a, b;
    cin >> a;
    for(int i = 1; i <= a; i  )
      {
        b = pow(i,2);
        if (b <= a) cout << b << " ";
      }
 return 0;
}
  

Комментарии:

1. Не используйте pow функцию, потому что она предназначена для с плавающей запятой. Вместо этого попробуйте b = i * i; . Последнее также более эффективно.

2. Ваша проблема связана с преобразованием целого числа в число с плавающей запятой, а затем с плавающей запятой в целое число. Попробуйте это: double d = 5.0 * 5.0; std::cout << d << "n"; .

3. Используйте std::pow() вместо простого pow() , первый имеет перегрузки для целых чисел. Версия с плавающей запятой приведет к ответу с плавающей запятой, который может быть не совсем эквивалентен 25. Если оно чуть меньше, преобразование из числа с плавающей запятой в целое число округлит его до 24.

4. Примечание: если b больше a — вы должны выйти из цикла

5. Не удалось воспроизвести ваш пример: попробуйте онлайн!

Ответ №1:

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

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

пример кода:

 #include <iostream>

int main()
{
    int a;
    std::cin >> a;
    for (int b, i = 1;;   i)
    {
        b = i * i;
        if (b > a)
            break;
        std::cout << b << " ";
    }
    return 0;
}
  

Ответ №2:

Ваша проблема, вероятно, вызвана функцией pow(). Хотя я не смог воспроизвести эту ошибку (cmath в MinGW и Visual C использует std::pow, который имеет целочисленные перегрузки начиная с C 98), я полагаю, что ваш компилятор по какой-то причине использует перегрузку с плавающей запятой. Вы должны попробовать заменить b = pow(i,2) на b = i * i .