我正在努力正确地实现这一点。我想创建一个函数来确定用户输入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)效率
答案 0 :(得分:0)
请务必仔细检查边缘情况。
for
?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" />
是多少?/* Acquire MultiCast Lock */
WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
会通过测试吗?我认为如果你仔细考虑这三行问题,你就会把这个问题搞得一团糟。
答案 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;
}