约数的个数

题目描述

输入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)//开方

posted @ 2020-02-24 15:48  菜鸟冲冲冲  阅读(223)  评论(0)    收藏  举报