一个数组,其中每个元素都是数字的因数和下一个元素的因数

时间:2019-02-15 22:03:56

标签: c++ arrays

之前,我是编程方面的新手。我实际上是一名高中生,因此我的问题听起来很愚蠢。 我想创建一个数组,其中每个元素都是数字的除数和下一个元素的除数:例如对于n = 12

1 2 6 12

我的解决方案:

#include <iostream>

using namespace std;

int main()
{
    int n, d, i, j, a[100];
    cin>>n;
    for(d=n; d>=1; d--)
    {
        if(n%d==0)
            j++;
    }

    for(i=1; i<=j; i++)
    {
        for(d=n; d>=1; d--)
        {
            if(n%d==0)
                a[i]=n%d;
        }
    }
    for(i=1; i<=j; i++)
    {
        cout<<a[1];
        if(a[i]%a[i+1]==0)
            cout<<a[i+1]<<" ";
    }
    return 0;
}

它给我以下错误:-1073741676(0xC0000094)

对此问题的解决方案将不胜感激。我是这个社区的新手,自从进入高中后,我就对编程真正产生了热情。谢谢:)

1 个答案:

答案 0 :(得分:1)

j 用于包括在 a 中计算索引,但是它从未在您的 main

中初始化

if(a[i]%a[i+1]==0)

您通过进行if(n%d==0) a[i]=n%d;初始化 a ,因此a[i+1]始终为0,因此模始终无效。

此外,由于仅初始化 a 直到索引 j ,所以当 i 时,您将使用a[i+1]来访问未初始化的值是 j


可能是:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
  int n;

  if (!(cin >> n))
    return -1;

  if (n == 0) {
    cout << "there are an infinite number of solution for 0" << endl;
    return -1;
  }

  vector<int> v;

  // 1 is a first value
  v.push_back(1);

  int max = (n > 0) ? n : -n;

  for (int d = 2; d <= max; ++d) {
    if ((n % d) == 0) {
      // can be a candidate, check if compatible with last value
      if ((d % v.back()) == 0)
        v.push_back(d);
    }
  }

  for (vector<int>::const_iterator it = v.begin(); it != v.end(); ++it)
    cout << *it << ' ';
  cout << endl;

  return 0;
}

我们在C ++中,所以我使用 vector 而不是具有最大大小的C数组

我检查读取的数字,并绕过0的情况,我还处理输入数字为负的情况以停止搜索,并决定使用正值。

编译和执行:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra v.cc
pi@raspberrypi:/tmp $ ./a.out
12
1 2 4 12 
pi@raspberrypi:/tmp $ 

请注意,如果我从数字而不是从1开始搜索,则会给出其他值:

#include <iostream>
#include <list>
using namespace std;

int main()
{
  int n;

  if (!(cin >> n))
    return -1;

  if (n == 0) {
    cout << "there are an infinite number of solution for 0" << endl;
    return -1;
  }

  list<int> v;

  // the number itself is a first value
  v.push_back(n);

  for (int d = ((n > 0) ? n : -n) - 1; d != 0; --d) {
    if ((n % d) == 0) {
      // can be a candidate, check if compatible with first value
      if ((v.front() % d) == 0)
        v.push_front(d);
    }
  }

  for (list<int>::const_iterator it = v.begin(); it != v.end(); ++it)
    cout << *it << ' ';
  cout << endl;

  return 0;
}

那一次我使用 list push_front时,仍然可以使用 vector 将值与第一个版本相反

编译和执行:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra vv.cc
pi@raspberrypi:/tmp $ ./a.out
12
1 3 6 12