[英]Find the smallest integer whose sum of squares of digits add to the given number
[英]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.