【PAT甲级 排序】1096 Consecutive Factors (20 分) C++ 全部AC

题目

难倒是不难,暴力破解即可。要注意的就是开longlong,以及开方时,不要丢失临界值,还有如果子序列长度为0的话,输出num本身(因为计算的时候不考虑1这个因数)。
一开始想出来一种O(n)的算法,写着写着自己把自己绕进去了,后来改用暴力破解了。但是理论上应该可行(就是找最大连续子序列和的那个思想)
在这里插入图片描述


关于测试点“浮点错误”

OJ上浮点错误应该考虑:

  • 是否可能出现了一个数除以0的情况
  • 是否可能出现了一个数取余0的情况
  • 是否发生了数据溢出而导致的除以0或者取余0的情况

题解 C++

#include<iostream>
#include<math.h>
using namespace std;
int main() {
	long long int num;
	cin >> num;

	//寻找连续因数
	long long int pro = 1;		//乘积开longlong:否则"浮点错误"
	int maxLen = 0;				//最大长度
	int maxBegin = 0;			//最大长度起始点
	int maxEnd = 0;				//最大长度终止点

	int p = pow(num, 0.5);
	for (int i = 2; i <= p; i++) {//使用等号:开方时,不要丢失临界值!
		pro = 1;
		for (int j = i; pro <= num; j++) {
			pro *= j;
			if (num % pro == 0) {
				if (maxLen < j - i + 1) {
					maxLen = j - i + 1;
					maxBegin = i;
					maxEnd = j;
				}
			}
		}
	}

	//如果最大长度为0 输出n本身
	if (maxLen == 0) {
		cout << 1 << "\n" << num << "\n";
	}
	else {
		cout << maxLen << "\n";
		for (int i = maxBegin; i <= maxEnd; i++) {
			cout << i;
			if (i != maxEnd) {
				cout << "*";
			}
		}
	}
	system("pause");
}

在这里插入图片描述

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页