C++ 使用θ(n)效率按顺序打印除数

C++ 使用θ(n)效率按顺序打印除数,c++,algorithm,C++,Algorithm,我正在努力正确地实现这一点。我想创建一个函数来确定用户输入的所有除数userNum,并将它们输出给用户。当userNum=16时,我得到的是输出1 16 2 8。我没想到顺序是正确的,但我错过了4个,我正在努力找出原因。有什么想法吗?我试图以θ(sqrt(num))的效率来做这件事 void PrintDivisors(int num); int main() { int userNum; //Request user number cout << "P

我正在努力正确地实现这一点。我想创建一个函数来确定用户输入的所有除数
userNum
,并将它们输出给用户。当
userNum
=16时,我得到的是输出1 16 2 8。我没想到顺序是正确的,但我错过了4个,我正在努力找出原因。有什么想法吗?我试图以θ(sqrt(num))的效率来做这件事

void PrintDivisors(int num);

int main()
{
    int userNum;

    //Request user number

    cout << "Please input a positive integer >=2:" << endl;
    cin >> userNum;

    PrintDivisors(userNum);

    return 0;
}

void PrintDivisors(int num)
{
    int divisorCounter;

    for (divisorCounter = 1; divisorCounter < sqrt(num); divisorCounter++)
    {
        if (num % divisorCounter == 0 && num / divisorCounter != divisorCounter)
            cout << divisorCounter << endl << num / divisorCounter << endl;
        else if (num % divisorCounter == 0 && num / divisorCounter == divisorCounter)
            cout << divisorCounter << endl;
    }
}
void打印除数(int num);
int main()
{
int userNum;
//请求用户号码
coutusernum;
打印除数(userNum);
返回0;
}
无效打印除数(int num)
{
整数除数计数器;
对于(divisorCounter=1;divisorCounter请务必仔细检查您的边缘状况

  • 什么是
    sqrt(num)
  • for
    循环中通过测试的最大
    除数计数器是多少
  • 4
    能通过测试吗
  • 我认为,如果你仔细观察这一行,并牢记这三个问题,你就会消除错误


  • 将循环终止条件操作更改为
    ,以使其在sqrt(n)时间复杂度下运行:


    对于任何n=a X b。或者a这是我最终使用的解决方案,这也节省了空间复杂性。我一直在努力思考以升序循环解决方案的有效方法,但这一方法运行得非常快,比附加到向量或数组或一些奇怪的字符串串联更好

    void printDivisors(int num)
    {
      for (int k = 1; k*k < num; k++)
      {
          if (num % k == 0)
              cout << k << " ";
      }
    
      for (int d = sqrt(num); d >= 1; d--)
      {
          if (num % d == 0)
              cout << num / d << " ";
      }
    
      cout << endl;
    }
    
    void打印除数(int num)
    {
    for(int k=1;k*kcout divisiorcountervector<int> otherNums;
    for(i=1;i*i<n;i++) {
        if(num%i==0){
            cout<<i<<endl;
            otherNums.push_back(n/i);
        } 
    }
    if(i*i == n) otherNums.push_back(i);
    for(i=(int)v.size() - 1 ;i>=0;i--) 
        cout<<otherNums[i]<<endl;
    
    void printDivisors(int num)
    {
      for (int k = 1; k*k < num; k++)
      {
          if (num % k == 0)
              cout << k << " ";
      }
    
      for (int d = sqrt(num); d >= 1; d--)
      {
          if (num % d == 0)
              cout << num / d << " ";
      }
    
      cout << endl;
    }