C ++ все квадратные корни данного числа - PullRequest
0 голосов
/ 03 ноября 2019

Если у меня есть номер 75 , мой вывод должен выглядеть следующим образом: 64+9+1+1

Я пробовал это:

#include <iostream>
#include <cmath>

using namespace std;

int main() {
  int number, sum = 0;
  cin >> number;

  for (int i = number; i > 0; i--) {
    if (sqrt(i) == round(sqrt(i))) {
      if (number-i > 1) {
        cout << i << "+";
        number -= i;
        sum += i;
      }
    }
  }

  for (int i = number; i > 0; i--) {
    if (i == 1) {
      cout << "+1";
    } else {
      cout << "1";
    }
  }
}

С вводом 75 код работает правильно, но если я введу 24 , то я должен получить:

This: 16+4+4
However I get: 16+4+1+11+1

Если я наберу 1245

Iполучить это: 1225+16+1+11+1

Однако правильный ответ: 1225+16+4

Любая помощь приветствуется. Заранее спасибо:)

Ответы [ 2 ]

3 голосов
/ 03 ноября 2019

Мои 5 центов здесь. Идея состоит в том, чтобы найти ближайший квадратный корень, степень 2 которого меньше или равна заданному числу. Запишите это квадратное число, а затем вычтите его из числа. Повторите процедуру, если число все еще больше 0 (я полагаю, number - положительное целое число):

void main() {
    int number;
    cin >> number;

    while (number > 0) {
        int floorRoot = floor(sqrt(number));
        int squareNumber = floorRoot * floorRoot;

        cout << squareNumber;
        number -= squareNumber;

        if (number > 0) {
            cout << "+";
        }
    }
}

Пример использования

Ввод: 67

Выход: 64 + 1 + 1 + 1

ОБНОВЛЕНИЕ:

Если number - любое целое числотогда код можно улучшить следующим образом:

void main() {
    int number;
    cin >> number;

    if (!number) {
        cout << "0";
        return;
    }

    while (number != 0) {
        int floorRoot = floor(sqrt(abs(number)));
        int squareNumber = floorRoot * floorRoot;

        if (number > 0) {
            cout << squareNumber;
            number -= squareNumber;
        } else {
            cout << -squareNumber;
            number += squareNumber;
        }

        if (number > 0) {
            cout << "+";
        }
    }
}

Примеры использования

Ввод: -67

Выход: -64-1-1-1

Вход: 67

Выход: 64 + 1 + 1 + 1

Вход: 0

Выход: 0

2 голосов
/ 03 ноября 2019

Я думаю, вы должны сначала переписать алгоритм.

1) Начните итерацию с sqrt(number), а не с числа, вплоть до 1, обработайте i как корень (то есть возведите его в квадрат). Это должно быть намного быстрее.

2) Чтобы проверить, что необходим символ +, лучше иметь флаг bool, который обозначает, что что-то уже записано в вывод, и записать + до квадратное число на основе этого флага.

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

...