約數的個數

2021-08-19 04:15:58 字數 797 閱讀 1470

題目描述:輸入n個整數,依次輸出每個數的約數的個數。

輸入描述:

輸入的第一行為n,即陣列的個數(n<=1000),接下來的1行包括n個整數,其中每個數的範圍為(1<=num<=1000000000),當n=0時輸入結束。

輸出描述:可能有多組輸入資料,對於每組輸入資料,輸出n行,其中每一行對應上面的乙個數的約數的個數。

分析:如何求乙個數的約數個數,常規的就是從1- n(表示這個數本身),設為i。如果n% i == 0,則說明i是它的約數,計數器count ++。但是這樣寫,複雜度不滿足提交需求。

1、所以介紹乙個約數個數定理:

對於乙個大於1正整數n可以分解質因數:

則n的正約數的個數就是

其中a1、a2、a3…ak是p1、p2、p3,…pk的指數。

2、但是我們是將n開根號,即sqrt(n),然後求1-sqrt(n)中的約數個數,記作num。令m = sqrt(n), 如果m 是整數,num * 2 + 1, 否則是2 * num。

#include#includeusing namespace std;

// 求約數時,如果完全遍歷,複雜度太大,所以使用開根號的方式。

int main()

}if(m * m == a[i])

cout << count << endl;

} } return 0;

}

此外需要注意的是,它是以0作為結束標誌, 如果是使用scanf,那麼他結束的標誌記得改為0, 而不是eof。

約數的個數

輸入n個整數,依次輸出每個數的約數的個數。輸入的第一行為n,即陣列的個數 n 1000 接下來的1行包括n個整數,其中每個數的範圍為 1 num 1000000000 當n 0時輸入結束。可能有多組輸入資料,對於每組輸入資料,輸出n行,其中每一行對應上面的乙個數的約數的個數。6 1 4 6 8 10...

約數的個數

對於約數個數的求法,開始我的 是逐個列舉取餘,這當然是乙個很簡單易懂的方法。但是整個程式的時間複雜度達到o n m 對於超級大的測試樣例來說,這顯然不可取。cin n個整數,cout 每乙個整數的約數個數 include include using namespace std 求約數個數 int f...

約數的個數

輸入n個整數,依次輸出每個數的約數的個數 輸入的第一行為n,即陣列的個數 n 1000 接下來的1行包括n個整數,其中每個數的範圍為 1 num 1000000000 當n 0時輸入結束。可能有多組輸入資料,對於每組輸入資料,輸出n行,其中每一行對應上面的乙個數的約數的個數。示例1 複製5 1 3 ...