给定一个整数,将其表示为 s 个平方和
Given an integer, represent it as s sum of squares
如果我有数字 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
我收到这个:1225+16+1+11+1
然而正确答案是:1225+16+4
感谢任何帮助。提前致谢:)
我觉得你应该先重写算法。
1) 从 sqrt(number)
开始迭代,而不是从数字开始,向下迭代到 1,将 i
视为根(即平方)。应该会快很多。
2) 要检查是否需要 +
字符,最好有一个 bool 标志,表示已将某些内容写入输出并写入 +
之前基于该标志的平方数。
我认为你算法的问题是每个方格最多检查一次,而它可能出现不止一次。
我的 5 美分在这里。这个想法是找到最接近的平方根,其 2 的幂小于或等于给定的数字。写下这个平方数,然后从数字中减去它。如果数字仍然大于 0
(我假设 number
是一个正整数),请重复该过程:
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 << "+";
}
}
}
用法示例
Input: 67
Output: 64+1+1+1
更新:
如果number
是任意整数那么代码可以改进如下:
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 << "+";
}
}
}
用法示例
Input: -67
Output: -64-1-1-1
Input: 67
Output: 64+1+1+1
Input: 0
Output: 0
如果我有数字 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
我收到这个:1225+16+1+11+1
然而正确答案是:1225+16+4
感谢任何帮助。提前致谢:)
我觉得你应该先重写算法。
1) 从 sqrt(number)
开始迭代,而不是从数字开始,向下迭代到 1,将 i
视为根(即平方)。应该会快很多。
2) 要检查是否需要 +
字符,最好有一个 bool 标志,表示已将某些内容写入输出并写入 +
之前基于该标志的平方数。
我认为你算法的问题是每个方格最多检查一次,而它可能出现不止一次。
我的 5 美分在这里。这个想法是找到最接近的平方根,其 2 的幂小于或等于给定的数字。写下这个平方数,然后从数字中减去它。如果数字仍然大于 0
(我假设 number
是一个正整数),请重复该过程:
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 << "+";
}
}
}
用法示例
Input: 67
Output: 64+1+1+1
更新:
如果number
是任意整数那么代码可以改进如下:
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 << "+";
}
}
}
用法示例
Input: -67
Output: -64-1-1-1
Input: 67
Output: 64+1+1+1
Input: 0
Output: 0