題目描述:輸入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 ...