繁体   English   中英

给定一个 integer,将其表示为 s 平方和

[英]Given an integer, represent it as s sum of squares

如果我有数字75 ,我的 output 应该看起来像: 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

我收到这个: 1225+16+1+11+1

然而正确答案是: 1225+16+4

任何帮助表示赞赏。 提前致谢:)

我的 5 美分在这里。 这个想法是找到2的幂小于或等于给定数字的最接近的平方根。 写下这个平方数,然后从数字中减去它。 如果数字仍然大于0 ,则重复该过程(我假设number是正 integer 数字):

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

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

        cout << squareNumber;
        number -= squareNumber;

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

示例用法

输入:67

Output:64+1+1+1

更新:

如果number是任何 integer 那么代码可以改进如下:

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

    // abs(INT_MIN) is still negative!!!
    if (number == INT_MIN) {
        printf("Please provide a number larger than %i", INT_MIN);
        return;
    }

    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

Output:-64-1-1-1

输入:67

Output:64+1+1+1

输入:0

Output:0

我认为您应该首先重写算法。

1)从sqrt(number) ) 开始迭代,而不是从 number 向下迭代到 1,将i视为根(即平方它)。 它应该快很多。

2) 要检查是否需要+字符,最好有一个 bool 标志,表示已经将某些内容写入 output 并在基于该标志的平方数之前写一个+

我认为您的算法的问题在于您最多检查每个正方形一次,而它可能会出现不止一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM