我不是C ++的熟练者或高级者,我无法解决问题。 我知道如何数学上做,但是我无法编写源代码,我的算法是错误且混乱的。
所以,问题是我必须编写一个从键盘读取数字(n)的代码,然后它必须找到一个等于n平方(n ^ 2)的和以及该和元素的数量必须等于n。 例如3 ^ 2 = 9、3 ^ 2 = 2 + 3 + 4、3个元素,而3 ^ 2是9 = 2 + 3 + 4。 我做了几次尝试,但都没有成功。 我知道我很愚蠢,但至少我尝试过。
如果有人有时间解决这个问题并愿意帮助我,我将非常感激。
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int main()
{
//1,3,5,7,9,11,13,15,17,19,21,23,25,27..
int n;
list<int> l;
cin >> n;
if ( n % 2 == 0 ){
cout << "Wrong." << endl;
}
for ( int i = 1; i <= 99;i+=2){
l.push_back(i);
}
//List is full with 1,3,5,7,9,11,13,15,17,19,21,23,25,27..
list<int>::iterator it = find(begin(l),end(l), n);
}
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
// 3^2 = 2 + 3 + 4
// 7^2 = 4 + 5 + 6 + 7 + 8 + 9 + 10
int n;
int numbers[100];
for (int i = 0; i <= 100; i++){
numbers[i] = i;
}
cin >> n;
int requiredSum;
requiredSum = n * n;
//while(sum < requiredSum){
// for(int i = 1; i < requiredSum; i++){
// sum += i;
// sumnums.push_back(sum);
// }
//}
int sum = 0;
std::vector<int> sumnums;
while(sum < requiredSum){
for(int i = 1; i < requiredSum; i++){
sum += i;
sumnums.push_back(sum);
}
}
for(int i=0; i<sumnums.size(); ++i)
std::cout << sumnums[i] << ' ';
}
总和的数字必须是连续的数字,例如3 * 3必须等于2 + 3 + 4而不是3 + 3 + 3。
因此,我的第一次尝试是为每个款项找到一条规则。 例如3 * 3 = 2 + 3 + 4、5 * 5 = 3 + 4 + 5 + 6 + 7、7 * 7 = 4 + 5 + 6 + 7 + 8 + 9 + 10。
每个总和都从前一个总和的第二个元素开始,并继续等于n-1的多个元素,例如3 * 3 = 2 + 3 + 4,5 * 5,5 * 5的总和以3 +另外4个元素。
另一种算法是@molbdnilo,例如3 * 3 = 3 + 3 + 3 = 3 + 3 + 3-1 + 1,3 * 3 =(3-1)+ 3 +(3 + 1 ),然后5 * 5 =(5-2)+(5-1)+ 5 + 5 + 1 + 5 + 2
答案 0 :(得分:1)
如果对构成总和的元素没有限制,最简单的解决方案是将n
次n
求和,该次数始终为n^2
。 / p>
int main()
{
int n;
cout<<"Enter n: ";
cin >> n;
for(int i=0; i<n-1; i++){
cout<<n<<"+";
}
cout<<n<<"="<<(n*n);
return 0;
}
答案 1 :(得分:1)
让我们手工做一些特殊情况。
(这里的除法是整数除法。)
3^2: 9
2 + 3 + 4 = 9
x-1 x x+1
1 is 3/2
5: 25
3 + 4 + 5 + 6 + 7 = 25
x-2 x-1 x x+1 x+2
2 is 5/2
7: 49
4 + 5 + 6 + 7 + 8 + 9 + 10
x-3 x-2 x-1 x x+1 x+2 x+3
3 is 7/2
似乎我们正在寻找从n - n / 2
到n + n / 2
的顺序。
(或者,等效地,从n / 2 + 1
到n / 2 + n
,但我喜欢对称。)
假设这是正确的(作为练习留下的证明;-):
int main()
{
int n = 0;
std::cin >> n;
if (n % 2 == 0)
{
std::cout << "Must be odd\n";
return -1;
}
int delta = n / 2;
for (int i = n - delta; i <= n + delta; i++)
{
std::cout << i << " ";
}
std::cout << std::endl;
}
答案 2 :(得分:0)
首先,最好使用std::vector<>
比std::list<>
更好,至少在元素少于〜百万的情况下使用(由于容器的内部结构,速度会更快)。
第二,更喜欢使用++i
,而不是i++
。特别是在这种情况下
...for(int i = 1; i < requiredSum; i++)...
最后,
您遇到的唯一错误是您只是将新数字推入容器(std :: list,std :: vector等)而不是求和,所以
while(sum < requiredSum){
for(int i = 1; i < requiredSum; i++){
sum += i;
sumnums.push_back(sum);
}
更改为
// will count our numbers
amountOfNumbers = 1;
while(sum < requiredSum && amountOfNumber < n)
{
sum += amountOfNumbers;
++amountOfNumbers;
}
// we should make -1 to our amount
--amountOfNumber;
// now let's check our requirements...
if(sum == requiredSum && amountOfNumbers == n)
{
cout << "Got it!";
// you can easily cout them, if you wish, because you have amountOfNumbers.
// implementation of that I am leaving for you, because it is not hard ;)
}
else
{
cout << "Damn it!;
}
我假设您需要从1 到n*n
的序贯总数,它们的数量等于n
。
如果出现问题或需要解释,请随时与我联系。
更新。amountOfNumber 更新。#2:正确且简单的答案。
抱歉,这么长的答案。我想出了一个很棒的简单解决方案。 您的条件要求该方程 n x + ArPrg = n n,其中
ArPrg-Arithmetic progression(ArPrg =((n-1)*(1 + n-1))/ 2) 在仅使用未知变量 x 进行了一些处理之后,我们的最终方程将是 数学很酷:)x+(x+1)+(x+2)+... = n*n
为真,那么我们可以轻松找到一个解决方案。
#include <iostream>
int main()
{
int n;
std::cout << "Enter x: ";
std::cin >> n;
auto squareOfN = n * n;
if (n % 2 == 0)
{
std::cout << "Can't count this.\n";
}
auto x = n - (n - 1) / 2;
std::cout << "Our numbers: ";
for (int i = 0; i < n; ++i)
std::cout << x + i << " ";
return 0;
}