文章

40

粉丝

607

获赞

68

访问

400.6k

头像
1152约数个数(约数个数定理)
P1152 清华大学上机题
发布于2020年4月25日 17:23
阅读数 13.0k

#include<iostream>
#include<algorithm>

using namespace std;

int main(){
    int N,n,i,s,r;
    while(cin>>N){    //N表示要求几个数的约数个数
        while(N--){
            cin >> n;    //n表示要求约数个数的数字
            s = 1;    //n约数的个数
            for (i = 2; i * i <= n; i++) {    //质因数只会小于等于根号n;这里i * i <= n即可
                r = 0;    //约数个数定理中质约数的幂次
                while (n % i == 0) {    //n能整除质数的时候,i相应的表示质数
                    r++;    //r表示n能整除这个质数几次
                    n /= i;
                }
                if (r > 0) {    //约数个数定理求约数个数
                    r++;
                    s *= r;
                }
            }
            if (n > 1){    //n>1说明n本身就是质数,此时s=1,约数只有1和它本身,故乘2
				s *= 2;
			}       
            cout << s << endl;
        }
    }
	return 0;
}

首先这个题目是用约数个数定理来求解的,直接暴力遍历会超时。

在使用约数个数定理之前,要知道:

1、任何一个大于1的整数,都能分解成若干质数相乘(例:n=12;12=2*2*3)

2、n的质数约数只会出现在1~根号n之间(例:25的质约数只会在1~5之间出现)

...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发