PAT团队程序设计天梯赛-习题集L1-006 连续因子

 

题目要求

点击打开链接

题目分析

有一个测试点没有通过测试,现在的最高得分还是18分,直接贴代码了。希望朋友们多多指教

示例代码

import java.util.ArrayList;
import java.util.Scanner;
public class L1_006 {
	public static void main(String[] args) {
		//读取输入数
		Scanner input = new Scanner(System.in);
		int number = input.nextInt();
		input.close();
		
		//获取这个数的所有因子并将结果保存在一个ArrayList当中
		ArrayList<Integer> list = new ArrayList<Integer>();
		//为了缩短获取因子的时间 奇数的因子不可能是偶数 所以从3开始依次增加2
		int a = 0, b = 0;
		if(number % 2 == 0) {
			a = 2;
			b = 1;
		} else {
			a = 3;
			b = 2;
		}
		//如果因子大于Math.sqrt(number) 任意连续两个因子的乘积一定大于这个数 没有求解的必要 但是要考虑到素数这个特殊情况 下面会有特别的处理
		while(a <= Math.sqrt(number)) {
			if(number % a == 0) {
				//i 是这个数的一个因子
				list.add(a);
			}
			a += b;
		}
		
		//容器大小
		int length_list = list.size();
		//对于素数 只有1和它本身 题目要求1除外 就只剩下本身了
		if(length_list == 0) {
			System.out.println("1");
			System.out.println(number);
			//结束程序运行
			return;
		}
		//打印查看因子
//		for(int i = 0; i < length_list; i++) {
//			System.out.print(list.get(i) + " ");
//		}
//		System.out.println();
		//连续因子中的最后一个
		int end = list.get(0);
		//最大连续因子数
		int count_max = 1;
		//连续因子数
		int count = 1;
		//连续因子相乘的结果
		int num = list.get(0);
		
		//遍历容器寻找连续因子
		for(int i = 0; i < length_list - 1; i++) {
			if(list.get(i) + 1 == list.get(i + 1)) {
				//连续
				count++;
				num *= list.get(i + 1);
				if(num > number) {
					//连续因子相乘的结果大于这个数本身
					if(count_max == 1 && end == list.get(0)) {
						//如果之前没有出现过连续因子 截取目前的这个因子
						count_max = count - 1;
						end = list.get(i);
					} else {
						//看目前的这个连续因子的个数是否大于之前的 如果大于 替换掉
						if(count - 1 > count_max) {
							count_max = count - 1;
							end = list.get(i);
						}
					}
					//结束遍历
					break;
				}
			} else {
				//不连续
				if (count > count_max) {
					count_max = count;
					end = list.get(i);
				}
				//重新开始寻找连续因子
				count = 1;
				num = 1;
			}
		}
		//输出结果
		System.out.println(count_max);
		for(int i = count_max; i > 0; i--) {
			System.out.print(end + 1 - i);
			if(i != 1) {
				System.out.print("*");
			}
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值