PTA 7-84 连续因子 (20分) (C语言版附有详细讲解)

7-84 连续因子 (20分)

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

输入格式:

输入在一行中给出一个正整数 N(1<N<2
​31
​​)。

输出格式:

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

输入样例:
630

输出样例:
3
567
思路:1.方法:暴力求解 用循环把N的所有不同数开头(2开头 3开头 4开头 5 6 7 8 9…).的连续因子求出来(列如 一个数的连续因子有 234 34 4567 …) 题目要求出最长的连续因子 所以在求出一组因子后应该和上一组长度作比较选出最长的。
(注意在选择时 1.要记录最长因子长度 2.记录这组最长因子的开始那个数
为后续输出做准备)
2.思考到底要求多少组连续因子才结束循环尼(因为考虑到程序会超时问题) 其实可以发现一组连续因子(因子数个数为2及2以上)开头那个数不可能大于N的开根(不懂看哈列子 比如 9=33;因为因子数间呈递增关系 所以像求9的时候连续因子开头那个数肯定小于3)
这是限制循环结束的条件
3. 最重要的是如何找出连续因子
其实我们可以利用N%(连续因子积)==0 比如 630 可以分解为 3×5×6×7
630 %(5
67)==0 这个关系找出
这步代码细节:(t:记录一组连续因子的长度,sum记录因子乘积
i是连续因子的开头数
t=0;
sum=1;
for(j=i;;j++){
sum
=j;
if(N%sum==0) t++;
else break;

	 }

4.关键细节
在求出一组因子后应该和上一组长度作比较选出最长的。
注意在选择时 1.要记录最长因子长度 2.记录这组最长因子的开始那个数
为后续输出做准备)s初始值为0 t为长度 s=t;start=i; 用s和start 记录出最长长度和它的开头数
代码 if(t>s){ s=t; start=i; }
看懂了就开始撸代码吧 加油干就完了

总体代码:

int N;
 	scanf("%d",&N);
 	int i;
 	int sum;
 	double m=sqrt(N); //注意这里应该用double类型不用int 开方后的数不一定是整数
 	int j;
 	int t;
 	int s=0;
 	int start;
 	for(i=2;i<m;i++){
 		t=0;
 		sum=1;
 		for(j=i;;j++){
 			sum*=j;
 			if(N%sum==0) t++;
 			else  break;
 			
		 }
		 
		 if(t>s){ s=t; start=i;
		 	
		 }	
	     }
	     
 	printf("%d\n%d",s,start);
 	
 	while(s-1>0){
 		printf("*%d",++start);
 		s--;
 		 }
 	
	     }
  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值