质因子分解习题

问题 A: 完数

http://codeup.cn/problem.php?cid=100000592&pid=0
在这里插入图片描述
在这里插入图片描述

#include<cstdio>
#include<cmath>
int main(void)
{
    
    
	int n;
	int i,j;
	while( scanf("%d",&n) != EOF )
	{
    
    
		if(n<6)
			continue;
		else
		{
    
    
			printf("6 ");
			for(i=7;i<=n;i++)
			{
    
    
				int sum=1;
				int sql=(int)sqrt(i*1.0);
				for(j=2;j<=sql;j++)
				{
    
    
					if(i%j==0)
					{
    
    
						sum=sum+j+i/j;
					}
				}
				if(sql*sql==i)// 36这种类似的情况
				{
    
    
					sum=sum-sql;
				}
				if(sum==i)
					printf("%d ",i);
			}
			printf("\n");
		}
	}
	return 0;
}

问题 C: 质因数的个数

http://codeup.cn/problem.php?cid=100000592&pid=2

在这里插入图片描述
在这里插入图片描述
题目中给的最大数并不是特别大。所以打印出前100多中的质数表就足以。

#include<cstdio>
#include<cmath>
int a[50]={
    
    2};
int main(void)
{
    
    
	int i,j,n;
	int k=1;
	for(i=3;i<=120;i++)
	{
    
    
		for(j=2;j<=(int)sqrt(1.0*i);j++)
		{
    
    
			if(i%j==0)
				break;
		}
		if(j>(int)sqrt(1.0*i))
		{
    
    
			a[k++]=i;
		}
	}
	while( scanf("%d",&n) != EOF )
	{
    
    
		int count=0;
		for(i=0;i<k;i++)
		{
    
    
			while(n%a[i]==0)
			{
    
    
				n=n/a[i];
				count++;
			}
		}
		if(n!=1)
		{
    
    
			count++;
		}
		printf("%d\n",count);
	}
	return 0;
}

问题 D: 约数的个数

http://codeup.cn/problem.php?cid=100000592&pid=3
在这里插入图片描述
在这里插入图片描述

#include<cstdio>
#include<cmath>
int main(void)
{
    
    
	int n;
	int number;
	int i,j,count;
	while(1)
	{
    
    
		scanf("%d",&n);
		if(n==0)
			break;	
		for(i=0;i<n;i++)
		{
    
    
			scanf("%d",&number);
			count=0;
			int sql=(int)sqrt(1.0*number);
			for(j=1;j<=sql;j++)
			{
    
    
				if(number%j==0)
				{
    
    
					count++;
					count++;
				}
			}
			if(sql*sql==number)
				count--;
			printf("%d\n",count);
		}
	}
	return 0;
}

精简版:

#include <cstdio>
#include <cmath>
int main() {
    
    
    int n;
    while (scanf("%d", &n), n) {
    
    
        for (int i = 0; i < n; i++) {
    
    
            int t, cnt = 0;
            scanf("%d", &t);
            int sqr = (int)sqrt(1.0 * t);
            for (int i = 1; i <= sqr; i++) {
    
    
                if (t % i == 0) cnt += 2; //如1和t本身, 一次性算2个
                if (i * i == t) cnt--; //如36, 作为约数集合的对称轴6只算一次
            }
            printf("%d\n", cnt);
        }
    } 
    return 0;
}

问题 E: 完数与盈数

http://codeup.cn/problem.php?cid=100000592&pid=4
在这里插入图片描述

#include<cstdio>
#include<cmath>
int main(void)
{
    
    
	int n;
	int i,j;
	int sum;
	int a[50]={
    
    0};
	int b[50]={
    
    0};
	a[0]=6;
	int a_index=1;
	int b_index=0;
	for(i=7;i<=60;i++)
	{
    
    
		sum=1;
		int sql=(int)sqrt(i*1.0);
		for(j=2;j<=sql;j++)
		{
    
    
			if(i%j==0)
			{
    
    
				sum=sum+j+i/j;
			}
		}
		if( sqrt(i)*sqrt(i) == i )// 36这种类似的情况
		{
    
    
			sum=sum-sql;
		}
		if(sum==i)
			a[a_index++]=i;
		if(sum>i)
		{
    
    
			b[b_index++]=i;
		}
	}
	printf("E: ");
	for(i=0;i<a_index-1;i++)
	{
    
    
		printf("%d ",a[i]);
	}
	printf("%d\n",a[a_index-1]);
	printf("G: ");
	for(i=0;i<b_index-1;i++)
	{
    
    
		printf("%d ",b[i]);
	}
	printf("%d\n",b[b_index-1]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46527915/article/details/115077935