poj2635 同余定理 + 素数筛法

本文介绍了一种算法,用于判断一个大数是否为两个特定素数的乘积,并通过大数求余操作来高效地完成这一过程。文章详细解释了算法原理,包括如何快速找到可能的较小素数因子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      题意:给定一个数,这个数是两个素数的乘积,并给定一个限制L,问是否两个素数中存在小于L的数,若存在输出较小质数,否则打印‘GOOD’。

    思路:

1 . x = a * b, a和b都是素数,那么x只能分解为(1,x)或则(a,b),因为 x 只有四个因子1,a,b,x。

2 . 判定某大数y能否被x整除,可以通过求余是否为0判断。大数求余的方法在我的上一篇文章中有证明。

3 . 素数打表,方便快速判断某个数是否为质数。

根据第一个结论,可以知道如果某个素数(这个数小于限制L)能被大数整除,那么这个数就是最小质数,就可以结束判断。


AC代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = 1000005;
int vis[maxn], prim[maxn], a[105];
char s[105];

int deal(int n){
	int m = sqrt(n + 0.5);
	memset(vis, 0, sizeof(vis));
	for(int i = 2; i <= m; ++i) if(!vis[i])
		for(int j = i*i; j <= n; j += i) vis[j] = 1;
		
	int cnt = 0;
	for(int i = 2; i < n; ++i){
		if(!vis[i]) prim[cnt++] = i;
	}
	return cnt;
}

// 转换千进制
int turn(int n){
	memset(a, 0, sizeof(a));
	int c = 0;
	int m = n % 3;
	for(int i = 0; i < m; ++i) a[c] = a[c] * 10 + s[i] - '0';
	if(m) ++c;
	for(int i = m; i < n; i += 3){
		for(int j = i; j < i + 3; ++j)
			a[c] = a[c] * 10 + s[j] - '0';
		++c;
	}
	return c;
} 

bool mod(int x, int n) {
	int m = 0;
	for(int i = 0; i < n; ++i){
		m = (m * 1000+ a[i]) % x;
	}
	if(m == 0) return true;
	return false;
}


int main(){
	int n = deal(maxn);
	int h;
	while(scanf("%s%d", s, &h) == 2 && h){
		int len = strlen(s);
		len = turn(len);
		int flag = 1;
		for(int i = 0; prim[i] < h && i < n; ++i) {
			if(mod(prim[i], len)) {
				printf("BAD %d\n", prim[i]);
				flag = 0;
				break;
			}
		}
		if(flag) printf("GOOD\n");
	}
	return 0;
}

如有不当之处欢迎指出!


资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟字转换器)将模拟电压信号转换为字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和据结构定义。处理电压据时,可能涉及浮点运算,需要了解STC单片机对浮点的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值