使用theta(n)效率按顺序打印除数

时间:2017-02-23 22:37:17

标签: c++ algorithm

我正在努力正确地实现这一点。我想创建一个函数来确定用户输入userNum的所有除数,并将它们输出给用户。当userNum = 16时,我得到输出1 16 2 8.我没有预料到订单是正确的,但我错过了4并且正在努力弄清楚原因。有什么想法吗?我试图以theta(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;
    }
}

更新:我已打印所有数字,但仍在尝试确定如何按顺序打印它们,同时保持在θsqrt(n)效率

3 个答案:

答案 0 :(得分:0)

请务必仔细检查边缘情况。

  1. 什么是for
  2. 4循环中通过测试的最大<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 是多少?
  3. /* Acquire MultiCast Lock */ WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock"); multicastLock.setReferenceCounted(true); multicastLock.acquire(); 会通过测试吗?
  4. 我认为如果你仔细考虑这三行问题,你就会把这个问题搞得一团糟。

答案 1 :(得分:0)

使其以sqrt(n)时间复杂度运行:

对于任何n = a X b。 a&lt; = sqrt(n)或b&lt; = sqrt(n)。 因此,如果你能找到范围[1,sqrt(n)]中的所有除数,你可以找到大于sqrt(n)的其他除数

您可以使用for循环遍历范围1到sqrt(n)中的数字,并查找小于sqrt(n)的所有除数,同时您还可以使用它来查找大于(或等于)的其他数字到)sqrt(n)。

假设一个数字i&lt; sqrt(n)是除数或n。在这种情况下,数字k = n / i也将是n的除数。但大于sqrt(n)。

按排序顺序打印数字:

在查找范围[1,sqrt(n)]中的除数期间,仅打印范围[1,sqrt(n)]中的除数。您可以使用数组/向量来存储范围[sqrt(n),n]和在for循环结束后打印它们。这是一个示例代码

vector<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;

答案 2 :(得分:0)

这是我最终使用的解决方案,它也节省了空间复杂性。我一直在努力想出按升序循环解决方案的有效方法,但这个方法运行速度非常快,而且比附加到向量或数组或一些奇怪的字符串连接更好。

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