我不知道总和和数字的解决方案

时间:2018-06-29 14:10:07

标签: c++

我不是C ++的熟练者或高级者,我无法解决问题。 我知道如何数学上做,但是我无法编写源代码,我的算法是错误且混乱的。

所以,问题是我必须编写一个从键盘读取数字(n)的代码,然后它必须找到一个等于n平方(n ^ 2)的和以及该和元素的数量必须等于n。 例如3 ^ 2 = 9、3 ^ 2 = 2 + 3 + 4、3个元素,而3 ^ 2是9 = 2 + 3 + 4。 我做了几次尝试,但都没有成功。 我知道我很愚蠢,但至少我尝试过。

如果有人有时间解决这个问题并愿意帮助我,我将非常感激。

1

#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);

}

2

#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

3 个答案:

答案 0 :(得分:1)

如果对构成总和的元素没有限制,最简单的解决方案是将nn求和,该次数始终为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 / 2n + n / 2的顺序。
(或者,等效地,从n / 2 + 1n / 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++)...

看看over here

最后,

您遇到的唯一错误是您只是将新数字推入容器(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:正确且简单的答案。 抱歉,这么长的答案。我想出了一个很棒的简单解决方案。

您的条件要求该方程x+(x+1)+(x+2)+... = n*n为真,那么我们可以轻松找到一个解决方案。

  

n x + ArPrg = n n,其中       ArPrg-Arithmetic progression(ArPrg =((n-1)*(1 + n-1))/ 2)

在仅使用未知变量 x 进行了一些处理之后,我们的最终方程将是

#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;
}

数学很酷:)