当前位置: 首页 > news >正文

老题新解|大整数的因子

《信息学奥赛一本通》第167题:大整数的因子

题目描述:
已知正整数 k 满足 2<=k<=92<=k<=92<=k<=9,现给出长度最大为 30 位的十进制非负整数 c,求所有能整除 c 的 k。
输入:
一个非负整数 c,c 的位数不大于 30。
输出:
若存在满足 c%k==0c\%k==0c%k==0 的 k,从小到大输出所有这样的 k,相邻两个数之间用单个空格隔开;若没有这样的 k,则输出 none。
样例输入:
30
样例输出:
2 3 5 6

大家好,我是莫小特。
这篇文章给大家带来《信息学奥赛一本通》中的第 167 题:大整数的因子。

image.png

一、题目描述

题目描述:
已知正整数 k 满足 2<=k<=92<=k<=92<=k<=9,现给出长度最大为 30 位的十进制非负整数 c,求所有能整除 c 的 k。
输入:
一个非负整数 c,c 的位数不大于 30。
输出:
若存在满足 c%k==0c\%k==0c%k==0 的 k,从小到大输出所有这样的 k,相邻两个数之间用单个空格隔开;若没有这样的 k,则输出 none。
样例输入:
30
样例输出:
2 3 5 6

二、题意分析

这道题是信息学奥赛一本通练习题的第 167 题。

普通的整型除法在数值范围较小时可以直接使用 % 求余,但当整数超过 18 位时,long long 也无法存放整个数。
因此我们只能将输入的大整数视作字符串进行处理。

核心思想是:

通过模拟“手算取模”的过程:

从高位到低位逐位取出数字,累计余数,不断对 k 取模更新。

例如:
要判断 12345 是否能被 3 整除,
我们可以从左到右逐位计算余数:

当前位计算公式当前余数
1(0×10 + 1)%3=11
2(1×10 + 2)%3=00
3(0×10 + 3)%3=00
4(0×10 + 4)%3=11
5(1×10 + 5)%3=00
按照样例输入对数据进行验证。

最后余数为 0,说明 12345 能被 3 整除。

在程序中,我们就用这个方法来判断从 k=2 到 9 的所有整除情况。

三、完成代码

使用字符数组 char c[31] 存储输入数字(最多 30 位 + 1 个结束符)。

char c[31];
scanf("%s", c+1);

c+1 代表我们让数组从下标 1 开始,方便理解第 i 位。

计算长度。

n = strlen(c+1);

这一步计算数字共有多少位。

需要枚举 9 次,从 2 遍历到 9。

for(k = 2; k <= 9; k++)
{}

接下来求模,设置一个变量 t 作为当前余数。

t = 0;
for(i = 1; i <= n; i++)
{t = t * 10 + c[i] - '0'; // 累积余数t %= k;                  // 对k取模
}

这段循环完成了手动计算 c % k 的过程。

最后判断输出即可,如果余数 t 等于 0,说明能整除:

if(t == 0)
{flag = 1;printf("%d ", k);
}

循环结束后,如果一个都没找到,则输出 none

if(flag)printf("\n");
elseprintf("none\n");

按样例测试。

image.png

符合样例输入和输出。

三、完整代码

该题的完整代码如下:

#include <cstdio>
#include <cstring>
using namespace std;char c[31];
int main()
{int n, k, flag = 0, t;scanf("%s", c + 1);           // 从下标1开始存储输入n = strlen(c + 1);            // 求长度for (k = 2; k <= 9; k++){t = 0;                    // 初始化余数for (int i = 1; i <= n; i++){t = t * 10 + c[i] - '0'; // 模拟手算取模t %= k;}if (t == 0){flag = 1;printf("%d ", k);}}if (flag)printf("\n");elseprintf("none\n");return 0;
}

四、总结

通过本题《大整数的因子》的练习,我们掌握了用字符串处理大整数并模拟取模运算的常用技巧。当原始整数超过基本整型范围(例如超过 long long 能表示的范围)时,直接把数读为字符串并按位处理,是既安全又高效的做法。

本题的核心要点与收获:

1、字符串按位处理 —— 将大整数视为字符数组,从高位到低位逐位处理,避免数值溢出问题。

2、模拟取模法 —— 使用 t = (t * 10 + 当前位数字) % k 的方式,在线性时间内计算 c % k,该方法适用于任意大的十进制整数。

3、枚举与判断 —— 对 k 从 2 到 9 逐一枚举,分别用上面的方法判断能否整除,记录并输出满足条件的 k

4、输出格式处理 —— 注意当没有满足条件的 k 时输出 none,否则按题目要求从小到大、空格分隔输出所有满足条件的 k(结尾可以换行)。

通过这道题的训练,我们会更加熟练地在超过基本数据类型范围的问题中采用字符串与按位处理的思路,为处理其它高精度取模、比较类题目打下良好基础。

---end---

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!
如果有更好的方法也可以在评论区评论哦,我都会看哒~

我们下集见~

http://www.dtcms.com/a/469172.html

相关文章:

  • Eureka的自我保护机制
  • 探索颜色科学:从物理现象到数字再现
  • AirSim_SimJoyStick
  • 第五部分:VTK高级功能模块(第149章 Remote模块 - 远程模块类)
  • 道可云人工智能每日资讯|《政务领域人工智能大模型部署应用指引》发布
  • 自己做网站哪家好win10 wordpress安装教程视频
  • wordpress整体搬迁宁波seo深度优化平台有哪些
  • 4K Wallpaper mac v2.7.dmg 安装教程(Mac电脑详细安装步骤4K壁纸Mac下载安装)
  • Mac 软件出现「应用程序“xxx”不能打开」的解决办法
  • 东航集团客户网站是哪家公司建设4k高清视频素材网站
  • Compose 在Row、Column上使用focusRestorer修饰符失效原因
  • Sora 2:当AI视频“以假乱真”,内容创作进入新纪元,体验AI创作能力
  • 推荐一个浏览器代理插件(Tajang Proxy),支持Chrome和Edge
  • conda|如何通过命令行在mac上下载conda
  • VS Code 二次开发:跨平台图标定制全攻略
  • 关于微信小程序开发几点总结
  • 杭州建站价格邢台wap网站建设费用
  • kafka4使用记录
  • 2100AI智能生活
  • 网站开发交流群做网站线上线下价格混乱
  • AI:让驾驶体验个性化!
  • 由Nacos允许配置访问代理启发的Node前端部署路径转发探究
  • vue - JS 判断客户端是苹果 iOS 还是安卓 Android(封装好的方法直接调用)二种解决方案
  • 路由器如何判断数据转发目标
  • BEM命名规范
  • 12V-24V转3.2V-10V600mA恒流驱动芯片WT7018
  • 远程MCP的调用和阿里云生态的知识库和工作流的使用
  • 前端与后端开发之间的不同
  • 做企业免费网站鄂尔多斯北京网站建设
  • 网站建设优化服务好么锦州做网站