HDUOJ 2136 Largest prime factor

#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <algorithm>
#include <sstream>
#include <utility>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cctype>
#define CLOSE() ios::sync_with_stdio(false)
#define CLEAR(a, b) memset(a, b, sizeof(a))
#define IN() freopen("in.txt", "r", stdin)
#define OUT() freopen("out.txt", "w", stdout)
const int maxn = 1000005;
using LL = long long;
using UI = unsigned int;
using namespace std;
//------------------------------------------------------------------------------------------//
//真不愧是渣啊,,水题a半天。
//暴力打表法
int a[maxn], b[maxn], c[maxn];



//a,b,c分别用来记录一个数是否为素数,存储素数,记录素数在表中的位置
int main() {
	int cnt = 1;
	b[0] = 1;
	for (LL i = 2; i < maxn; ++i) {
		if (!a[i]) {
			b[cnt++] = i;
			c[i] = cnt - 1;
			for (LL j = i * i; j < maxn; j += i) a[j] = 1;
			//i*i会爆int即使改了j由于i*i是由i的类型决定的,所以i也要为LL,比较水的
		}
	}
	int n;
	while (scanf("%d", &n) == 1) {
		int maxfac = 0;
		int t = sqrt(n) + 1;
		for (int i = 1; b[i] <= t; i++) {
			if (n % b[i] == 0) {
				if(i > maxfac) maxfac = i;
				while(n % b[i] == 0) n /= b[i];
			}
		}
		if(n == 1) printf("%d\n", maxfac);
		else printf("%d\n", c[n]);
		//若进行了sqrt(n)+1内的循环后仍不唯一,那剩下的必定素数。
	}
	return 0;
}


//看了下别人的题解,原来直接打表时就可以记录下每个合数的最大素因子啦。
int main() {
	int cnt = 0;
	for (int i = 2; i < maxn; ++i) {
		if (!c[i]) {
			cnt++;
			//合数会被重复赋值从而最终记录下最后赋值也就是最大素因子的下表
			for (int j = i; j < maxn; j += i) c[j] = cnt;
		}
	}
	int n;
	while (scanf("%d", &n) == 1) printf("%d\n", c[n]);
	return 0;
}



//看了看线性筛法
int main() {
	int cnt = 1;
	b[0] = 1;
	for (LL i = 2; i < maxn; ++i) {
		if (!a[i]) {
			b[cnt++] = i;
			c[i] = cnt - 1;
			//cout << i << endl;
		}
		for (int j = 1; j < cnt && i * b[j] < maxn; ++j) {
			a[i * b[j]] = 1;
			//合数 = 他的最小质因子 * 合数 || 质数 * 质数;
			if (i % b[j] == 0) break;
			//保证前者
			//至于为啥这样就没有遗漏了,,下次再补上理论吧。
		}
	}
	int n;
	while (scanf("%d", &n) == 1) {
		int maxfacn = 0;
		int t = sqrt(n) + 1;
		for (int i = 1; b[i] <= t; ++i) {
			if (n % b[i] == 0) {
				maxfacn = i;
				while(n % b[i] == 0) n /= b[i];
			}
		}
		if (n == 1) printf("%d\n", maxfacn);
		else printf("%d\n", c[n]);
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值