Не могу понять в чем ошибка [закрыто]

273
26 ноября 2016, 19:03

По данному целому числу N распечатайте все квадраты натуральных чисел, не превосходящие N, в порядке возрастания. Формат входных данных Вводится натуральное число. Формат выходных данных Выведите ответ на задачу.

Sample Input: 50

Sample Output: 1 4 9 16 25 36 49

#include <iostream>
#include <cmath>
using namespace std;
int main() {
  int a, b = 1;
  cin >> a;
  while (b <= a) {
        if (float(sqrt(b)) % 1 == 0) {
            cout << b;
        }
        b++;
    }
  return 0;
}
Answer 1

В C++ для чисел с плавающей запятой не определен оператор взятия остатка %.

Поэтому условие в данном предложении if

if (float(sqrt(b)) % 1 == 0) {

неверное.

Проще будет записать следующий цикл

unsigned int a;
std::cin >> a;
for ( unsigned int i = 1, b; ( b = i * i ) <= a; i++ ) std::cout << b << ' ';
std::cout << std::endl;  

При этом нет никакой необходимости включать заголовок cmath и использовать объявленную в нем функцию sqrt.

Программу можно сделать более содержательной. Например,

#include <iostream>
int main() 
{
    while ( true )
    {
        std::cout << "Enter a non-negative number (0 - exit): ";
        unsigned int a;
        if ( not ( std::cin >> a ) || a == 0 ) break;
        for ( unsigned int i = 1, b; ( b = i * i ) <= a; i++ ) std::cout << b << ' ';
        std::cout << std::endl;
    }
    return 0;
}

Диалог с программой может выглядеть примерно так

Enter a non-negative number (0 - exit): 100
1 4 9 16 25 36 49 64 81 100 
Enter a non-negative number (0 - exit): 50
1 4 9 16 25 36 49 
Enter a non-negative number (0 - exit): 25
1 4 9 16 25 
Enter a non-negative number (0 - exit): 0
Answer 2

Что обозначает эта строчка для меня загадка.

if (float(sqrt(b)) % 1 == 0) {

Найти остаток от деления на 1 квадратного корня числа. Что Вы этим хотели сказать? Хотели проверить является ли число целым? Так это делается не так

if (1 - floor(sqrt(b)) < 1e-6) {

А Ваша задача решается так

int b = 1;
int c = 1;
while (c <= a) {
  cout << c;
  b++;
  c = b * b;
}
Answer 3

На мой взгляд, самая большая ошибка - решать вашу задачу методом перебора всех чисел и выяснять, не квадрат ли это число. Лучше идти в другом направлении и выводить поочереждно квадраты, пока они меньше запрошенного a (код специально упрощен, чтобы вам было понятнее):

#include <iostream>
using namespace std;
int main() 
{
    int a,b = 1;
    cin >> a;
    while(b*b <= a)
    {
        cout << b*b << " ";
        ++b;
    }
    cout << endl;
}
Answer 4
#include <iostream>
#include <cmath>
using namespace std;
int main() {
  int a,sqr = 1, b = 1;
  cin >> a;
  while (sqr <= a) {
    cout << sqr << " ";
    b++;
    sqr = b * b;;
  }
  return 0;
}

вывод:

50
1 4 9 16 25 36 49
500
1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484
READ ALSO
Ошибка при работе с компаратором [закрыто]

Ошибка при работе с компаратором [закрыто]

Пишу свой двунаправленный список (шаблонный класс)Нужно организовать вставку с автосортировкой (т

166
Удалить все четные числа [закрыто]

Удалить все четные числа [закрыто]

Дан текстовый файл, содержащий целые числаУдалить из него все четные числа

597