题目描述
输入n个整数,依次输出每个数的约数的个数
输入描述
输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。
输出描述
可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。
示例:
输入
5
1 3 4 6 12
输出
1
2
3
4
6
分析
这道题比较简单,直接暴力求解即可。唯一需要优化的一点就是可以只需要循环到sqrt即可,比如12,只需要算到3。之前的约数有1,2,3;那么sqrt后必然有12,6,4相同数目的约数与其对应。不过唯一需要注意的点就是,如果sqrt的值恰好是一个整数,那么这个约数就只能算一次。
AC代码如下
#include<iostream>
#include<cmath>
using namespace std;
int main(void)
{
int n;
while(cin >> n)
{
if(n == 0)
{
break;
}
//输入的数据没有爆long long int
long long int* num = new long long int[n];
int* result = new int[n];
for(int i = 0; i < n; ++i)
{
cin >> num[i];
int length = sqrt(num[i]);
//这里没有取等号,所以下面一步是加1操作
//如果这里取了等号,那么接下来就应该是减1操作
for(int j = 1; j < length; ++j)
{
if(num[i] % j == 0)
{
result[i] = result[i] + 2;//约数成对出现
}
}
if(length * length == num[i])//判断sqrt是否刚好是约数
{
++result[i];
}
}
for(int i = 0; i < n; ++i)
{
cout << result[i] << endl;
}
delete [] num;
delete [] result;
}
return 0;
}