约数的个数
题目描述
输入n个整数,依次输出每个数的约数的个数
输入描述:
输入的第一行为N,即数组的个数(N<=1000) 接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000) 当N=0时输入结束。
输出描述:
可能有多组输入数据,对于每组输入数据, 输出N行,其中每一行对应上面的一个数的约数的个数。
示例1
输入
5 1 3 4 6 12
输出
1 2 3 4 6
解题思路:本题最关键的是一个数num的约数的个数的求法。首先我想到的是将数num除以2,然后用num除以从1开始到(num/2)的所有数,
累计能够除尽的个数,从而能够得到约数的个数。
#include<iostream> using namespace std; int approNum(int a) { int count = 1; int j; for (j = 1; j <= a/2; j++) { if (a%j == 0) { count ++; } } return count; } int main() { int N; int i; int num; cin >> N; while (N>0 && N <= 1000) { for (i = 0; i<N; i++) { cin >> num; cout << approNum(num) << endl; } cin >> N; } return 0; }
这种方法的时间复杂度比较大,运行时间超时。
第二种方法,将数num开方
#include<iostream> #include<cmath> using namespace std; int approNum(int a) { int count = 0; int j; for (j = 1; j <sqrt(a) ; j++) { if (a%j == 0) { count+=2; } } if(j*j==a) { count++; } return count; } int main() { int N; int i; int num; while (cin >> N) { for (i = 0; i<N; i++) { cin >> num; cout << approNum(num) << endl; } } return 0; }
总结:通过此题学习到了约数个数的求法。
sqrt(num)//开方