题目:
输入n个整数,依次输出每个数的约数的个数。
思路:
思路一:一个数的所有约数从小到大排列,第i大和第i小的约数有对称性。而排在最中间的那个约数应该<=sqrt()。只需找到中间约数,再乘以2即可。
思路二: 使用约数个数定理。
两思路的程序差别只在yueShu()函数。
#include <iostream>
#include <stdio.h>
#include <cmath>
using namespace std;
//相关变量
int num,n,j;
//求一个整数的约数个数
int yueShu(int a);
//主函数
int main(){
int N,i;
int a[1002];
while(scanf("%d",&N)!=EOF && N!=0){
for(i=0;i<N;i++) //循环输入所有数
scanf("%d",&a[i]);
for(i=0;i<N;i++) //循环计算这些数的约数个数
printf("%d\n",yueShu(a[i])); //输出结果
}
return 0;
}
//求一个整数的约数个数
int yueShu(int a){
n=sqrt(a); //一个数的"中间约数"不超过数的开根号
for(num=1,j=2;j<=n;j++){
if(a%j==0)
num++;
}
num=(a==n*n)?(2*num-1):(2*num); //像16=4*4,4不应该重复计算,所以减一
return num;
}
以下是约数个数定理写得函数:
//求一个整数的约数个数
int yueShu(int a){
num=1; j=2; n=0;
//求出所有质因数
while(a!=1){
while(a%j==0){
n++;
a=a/j;
}
j++;
num*=(n+1); //n为该质因数的指数
n=0;
}
return num;
}