PTA L1-006 连续因子(详解)

前言:本期是关于pta题目:连续因子的详解,今天你c了吗?

PTA L1-006 连续因子(详解)_第1张图片

题目: 

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:

输入在一行中给出一个正整数 N(1

输出格式:

首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:

630

输出样例:

3
5*6*7

代码实现: 

#include
#include
int is_prime(int n)
{
	int j = 0;
	for (j = 2; j <= sqrt(n); j++)
	{
		if (n % j == 0)
		{
			return 0;
		}
	}
	return 1;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	if (is_prime(n))
	{
		printf("1\n");
		printf("%d", n);
	}
	else
	{
		int i = 0;
		int str = 0;
		int len = 0;
		for (i = 2; i <= sqrt(n); i++)
		{
			int ret = 1;
			int k = 0;
			for (k = i;ret*k<=n;k++)
			{
				ret *= k;
				if (n % ret == 0 && k-i+1>len)
				{
					str = i;
					len = k - i + 1;
				}
			}
		}
		printf("%d\n", len);
		for (i = str; i < str + len; i++)
		{
			if (i == str + len - 1)
			{
				printf("%d", i);
			}
			else
			{
				printf("%d*", i);
			}
		}
	}
	return 0;
}

代码解读: 

part 1:判断n是否为素数

    int n = 0;
	scanf("%d", &n);
	if (is_prime(n))
	{
		printf("1\n");
		printf("%d", n);
	}

读取一个整数n后,首先判断其是否为素数

若为素数:素数的因子只有1和它本身,由于题目要求1不算在因子行列,故而素数的因子个数为1

                  素数的因子是它本身

以下是判断是否为素数的函数:是素数return 1  不是素数return 0

注意:使用库函数sqrt 需要包含头文件: #include

int is_prime(int n)
{
	int j = 0;
	for (j = 2; j <= sqrt(n); j++)
	{
		if (n % j == 0)
		{
			return 0;
		}
	}
	return 1;
}

part 2 :找到并记录连续因子序列

        int i = 0;
		int str = 0;
		int len = 0;
		for (i = 2; i <= sqrt(n); i++)
		{
			int ret = 1;
			int k = 0;
			for (k = i;ret*k<=n;k++)
			{
				ret *= k;
				if (n % ret == 0 && k-i+1>len)
				{
					str = i;
					len = k - i + 1;
				}
			}
		}

1. 循环出2~sqrt(n)之间的所有数字

    一个整数的因子的所有可能性在2~sqrt(n)之间,题目告知1不算在因子行列

2. 每一个数字都要进行自己的累乘

   从这个数字本身开始,分别乘以后面的数字:

   每次乘以一个值,都要进行判断此时的累乘结果是否能被n整除,直至累乘的结果超过n本身

   若是累乘结果能被n整除,说明当前由一些乘在一起的数字都是n的因子,

   说明找到了一个连续的因子序列,此时需要记住这个连续因子序列的开头和长度

    (知道开头和长度就可以知道这个序列的起始和末尾)

定义str来记住当前连续因子序列的开头 ,定义len记录当前连续因子序列的长度

注意:记录下当前连续因子序列后,此时当前数字从自己开始的累乘已经结束了,下一次循环是另一个数字从自己开始的累乘的进行,又可能会找到存在于自它开始向后的数字中的连续因子序列

 由于我们要寻找的是最长的因子序列,故而若是新的连续因子序列长度>原来的连续因子长度

就需要更新连续因子序列,故而判断并记录连续因子序列的代码如下:

                if (n % ret == 0 && k-i+1>len)
				{
					str = i;
					len = k - i + 1;
				}

part 3 :打印输出

        printf("%d\n", len);
		for (i = str; i < str + len; i++)
		{
			if (i == str + len - 1)
			{
				printf("%d", i);
			}
			else
			{
				printf("%d*", i);
			}
		}

最后一个数字不需要*,其他位置的数字输出格式为:%d*

str:连续因子序列的开头

str+len-1:连续因子序列的末尾 

你可能感兴趣的:(PTA,c语言)