1.代码清晰,简单,易懂
链接:https://www.nowcoder.com/questionTerminal/04c8a5ea209d41798d23b59f053fa4d6
来源:牛客网
#include
using namespace std;
int numOfDivisor(int num)
{
int ans = 0;
int i;
if(num==1)//原代码当num=1时会出现错误,这里是我自己修改的
{
ans=1;
return;
}
for (i = 1; i*i<num; i++)//和i<sqrt(num)原理相同
{
if (num%i == 0)
ans += 2;//因为能整除,所以有两个因数,另外一个肯定大于i
}
if (i*i == num) ans++;//如,16=4*4,前面i的范围是1-3,i=4时跳出了循环,所以后面要再判断如果4*4=16了,约数个数再加1
return ans;
}
int main()
{
int n, num;
while (cin >> n)
{
for (int i = 0; i<n; i++)
{
cin >> num;
cout << numOfDivisor(num) << endl;
}
}
return 0;
} 2.复杂的质因数的分解法,如24=2^3*3,所以它的约数个数为(3+1)*(1+1)=8
#include<iostream>//修改后的版本,防止内存溢出
#include<cmath>
using namespace std;
unsigned int a[1000];
int sum[1000];
int j,sum1;
void init()
{
for (int i = 0; i < 1000; i++)
{
a[i] =sum[i]= 0;
}
}
void set(int x)
{
init();
for (int i = 0; i < x; i++)
cin >> a[i];
}
void getprimecnt(int x)
{
int cout ;
for (int i = 0; i < x; i++)
{
cout = 0;
sum1 = 1;
if (a[i] == 1)//同样对1单独输出
{
sum[i] = sum1;
continue;
}
int k =(int)sqrt(a[i])+1;
for (j = 2; j < k; j++)//质因数分解
{
cout = 0;
while (a[i] % j == 0)
{
cout++;//质因数的指数
a[i] /= j;
}
sum1 *= (cout+1);//指数的乘积
if(a[i]==1)
break;
}
if (a[i] != 1)//如果通过了前面质因数的分解后,num还没分解为1,说明num本身是一个质数,经历上面的分解过程没有改变num的值,因为分解范围是2-sqrt(num),
sum1*= 2;//所以他的因数是1和它本身,为2;
sum[i] = sum1;
}
}
void output(int x)
{
for (int i = 0; i < x; i++)
{
cout << sum[i] << endl;
}
}
int main()
{
int n;
while (cin >> n)
{
set(n);
getprimecnt(n);
output(n);
}
return 0;
}

京公网安备 11010502036488号