牛客网考研机试题集合:约数的个数

方法一:

直接统计约数的个数:从 1遍历到 sqrt(n),只是某些情况下可能会超时。

#include<bits/stdc++.h>
using namespace std;
int  num(int n) {
	int ans=0;
	int i;
	for(i=1; i*i<n; i++) {
		if(n%i==0) {
			ans+=2;
		}
	}
	if(i*i==n) {
		ans++;
	}
	return ans;
}
int main() {
	int n;
	while(scanf("%d",&n)!=EOF) {
		int a;
		for(int i=0; i<n; i++) {
			scanf("%d",&a);
			printf("%d\n",num(a));
		}
	}
	return 0;
}

方法二:

求出该数的所有素因数和以及相应的个数,比如12=2^2*3  素因数为2和3,对应的指数为2和1

因数的个数=(素因数a1的指数+1)*(素因数a2的指数+1)*.....

#include<bits/stdc++.h>
using namespace std;
const int N=100001;
int mark[N];
int primeSize;
int prime[N];
void init() {
	primeSize=0;
	for(int i=2; i<=100000; i++) {
		if(mark[i]==1) {
			continue;
		}
		prime[primeSize++]=i;
		if(i>=1000) continue;
		for(int j=i*i; j<=100000; j+=i) {
			mark[j]=1;
		}
	}
}
int main() {
	init();
	int n;
	while(scanf("%d",&n)!=EOF) {
		int a;
		while(n--) {
			scanf("%d",&a);
			if(a==1) {
				printf("1\n");
			} else {
				int ansPrime[50];
				int ansSize=0;
				int ansNum[50];
				for(int i=0; i<primeSize; i++) {
					if(a%prime[i]==0) {
						ansPrime[ansSize]=prime[i];
						ansNum[ansSize]=0;
						while(a%prime[i]==0) {
							ansNum[ansSize]++;
							a/=prime[i];
						}
						ansSize++;
						if(a==1) {
							break;
						}
					}

				}
				if(a!=1) {
					ansPrime[ansSize]=a;
					ansNum[ansSize++]=1;
				}
				int sum=1;
				for(int j=0; j<ansSize; j++) {
					sum=sum*(ansNum[j]+1);
				}
				printf("%d\n",sum);
			}
		}

	}
	return 0;
}
发布了53 篇原创文章 · 获赞 3 · 访问量 3490

猜你喜欢

转载自blog.csdn.net/sinat_38292108/article/details/104703360