c++中如何判断一个数是否为合数_c++合数判断逻辑与算法【汇总】
技术百科
裘德小鎮的故事
发布时间:2026-01-16
浏览: 次 合数是大于1且非质数的正整数,必有真因子;1既非质数也非合数,2是质数,4是最小合数;判断需先验证n>1,再试除2到√n。
什么是合数?先明确判断边界
合数是大于 1 的正整数,且不是质数——也就是说,它至少有一个真因子(即除 1 和自身外的正因数)。注意:1 既不是质数也不是合数;2 是质数,不是合数;4 是最小的合数。
所以判断逻辑起点必须是:n > 1,否则直接返回 false(不是合数)。
基础试除法:O(√n) 时间内完成判断
最常用、最直观的方法是遍历 2 到 sqrt(n),看是否有能整除 n 的数。只要找到一个,就是合数。
bool isComposite(int n) {
if (n <= 1) return false;
if (n == 2) return false; // 2 是质数
if (n % 2 == 0) return true; // 偶数(除 2 外)都是合数
for (int i = 3; i * i <= n; i += 2) {
if (n % i == 0) return true;
}
return false;
}
i * i 比i 更安全,避免浮点误差和类型转换开销- 先特判
2,再跳过所有偶数,减少一半循环次数 - 注意:
int类型下,i * i可能溢出(如n接近INT_MAX),此时应改用long long i或改用i
小范围预处理:用埃氏筛批量标记合数
如果需要频繁判断多个数(比如在 [2, 10^6] 内查几千次),预先筛出合数比反复试除快得多。
立即学习“C++免费学习笔记(深入)”;
const int MAXN = 1000001;
bool is_composite[MAXN] = {false};
void sieve() {
is_composite[0] = is_composite[1] = true; // 0 和 1 不是合数,但按定义常设为 true 方便统一处理?
// 实际上我们只关心 ≥2:让 is_

composite[i] 表示 i 是否为合数(i≥2)
for (int i = 2; i i < MAXN; ++i) {
if (!is_composite[i]) { // i 是质数
for (int j = i i; j < MAXN; j += i) {
is_composite[j] = true; // 标记合数
}
}
}
}-
is_composite[i]对i ≥ 2为true⇔i是合数 - 筛完后,单次查询是
O(1) - 注意:数组大小要覆盖到最大待查数,且初始化时
is_composite[0]和is_composite[1]应设为false(它们不是合数),除非你约定只查 ≥2
容易踩的坑:负数、0、大整数、类型隐式转换
-
isComposite(-5) 或 isComposite(0) 必须返回 false,合数定义仅针对正整数 ≥2
- 使用
unsigned int 时,n % 2 == 0 对 n=0 会误判(0 不是合数),所以开头仍需 n 拦截
- 若输入可能是
long long,循环变量也得用 long long,否则 i * i 溢出导致死循环或越界
- C++ 中
sqrt(n) 返回 double,对大整数可能精度丢失,例如 sqrt(999999999999999999) 可能向下取整错误,坚决避免
isComposite(-5) 或 isComposite(0) 必须返回 false,合数定义仅针对正整数 ≥2 unsigned int 时,n % 2 == 0 对 n=0 会误判(0 不是合数),所以开头仍需 n 拦截
long long,循环变量也得用 long long,否则 i * i 溢出导致死循环或越界 sqrt(n) 返回 double,对大整数可能精度丢失,例如 sqrt(999999999999999999) 可能向下取整错误,坚决避免 实际写的时候,别图省事写 sqrt(n),老实用 i 或 i * i (并确保类型不溢出)。
# 都是
# 多个
# 时间内
# 设为
# 循环
# c++
# int
# double
# 算法
# 类型转换
# 遍历
# 也得
# 浮点
# 合数
# 质数
# 身外
# 正整数
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- php订单日志怎么记录发货_php记录订单发货操作
- mac怎么退出id_MAC退出iCloud账号与A
- Win11时间怎么同步到原子钟 Win11高精度时
- 如何在 Go 后端安全获取并验证前端存储的 JWT
- C#如何序列化对象为XML XmlSerializ
- Win10怎么查看内存时序参数_Win10CPU-
- Win10如何更改网络连接_Windows10以太
- php嵌入式日志记录怎么实现_php将硬件数据写入
- 如何使用Golang sync.Map实现并发安全
- php下载安装包太大怎么下载_分卷压缩下载方法【教
- Win11怎样安装剪映专业版_Win11安装剪映教
- c++协程和线程的区别 c++异步编程模型对比【核
- PHP主流架构怎么监控运行状态_工具推荐【操作】
- php中::能用于接口静态方法吗_接口静态方法调用
- c++中如何对数组进行排序_c++数组排序算法汇总
- Win11蓝牙开关不见了怎么办_Win11蓝牙驱动
- php怎么下载安装后测试是否成功_简单脚本验证方法
- 如何使用Golang构建基础消息队列模拟_Gola
- Win10怎样安装PPT模板_Win10安装PPT
- Win11文件夹预览图不显示怎么办_Win11缩略
- php在Linux怎么部署_LNMP环境搭建PHP
- Linux怎么修改用户密码_Linux系统pass
- Win10怎么关闭自动更新错误弹窗_Win10策略
- php485函数执行慢怎么优化_php485性能提
- MAC如何修改默认应用程序_MAC文件后缀关联设置
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- 如何使用Golang写入二进制文件_Golang
- Windows系统时间服务错误_W32Time服务
- Python安全爬虫设计_IP代理池与验证码识别策
- Python 中将 ISO 8601 时间戳转换为
- LINUX怎么进行文本内容搜索_Linux gre
- Windows10如何删除Windows.old_
- Win11如何设置计划任务 Win11定时执行程序
- LINUX如何删除用户和用户组_Linux use
- Win10系统映像怎么恢复 Win10使用系统映像
- c++如何使用std::bitset进行位图算法_
- 如何使用Golang sort排序切片_Golan
- Windows10如何更改计算机工作组_Win10
- 如何高效识别并拦截拼接式恶意域名 spam
- Windows蓝屏错误0x0000001E怎么修复
- mac怎么右键_MAC鼠标右键设置与触控板手势技巧
- PythonDocker高级项目部署教程_多容器管
- php能控制zigbee模块吗_php通过串口与c
- mac本地php环境如何开启curl_curl扩展
- Win11怎么打开注册表_Windows 11注册
- php下载安装选zip还是msi格式_两种安装包对
- Windows10如何更改鼠标图标_Win10鼠标
- Win10怎样卸载TeamViewer_Win10
- Win11怎么开启上帝模式_创建Windows 1
- Win11怎么解压RAR文件 Win11自带解压功


QQ客服