1. 整除的尾数问题解析与实现1.1 问题重述与理解题目要求我们找出一个数的最后两位数字这个数的前几位已知为a且这个数能被另一个整数b整除。换句话说我们需要找到所有可能的两位数x00到99使得a*100 x能被b整除。举个例子如果a123b4我们需要找出x使得12300 x能被4整除计算12300%40所以x必须是4的倍数00,04,08,...,961.2 算法设计与实现核心思路是遍历所有可能的两位数0到99检查a*100 x是否能被b整除。以下是详细实现步骤#include stdio.h int getResult(int a, int b, int weishu[]) { int count 0; for (int x 0; x 100; x) { long long full_num (long long)a * 100 x; if (full_num % b 0) { weishu[count] x; count; } } return count; }关键点解析数据类型选择使用long long避免整数溢出。当a接近10000时a*100会达到1,000,000使用int可能溢出。遍历范围x从0到99覆盖所有可能的两位数组合。存储方式符合条件的x按顺序存入数组自然形成升序排列。1.3 优化与注意事项注意当b100时任何x都能满足条件此时结果将是所有00-99的数字。这种情况下可以特殊处理直接填充0-99。实际测试案例输入a123, b4输出00 04 08 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 962. 黑色星期五问题详解2.1 问题背景与要求计算在n年1900到1900n-1期间每月13号落在各星期几的次数。特别关注13号是星期五的情况西方文化中的黑色星期五。2.2 日期计算原理2.2.1 闰年判断bool isLeapYear(int year) { return (year % 4 0 year % 100 ! 0) || (year % 400 0); }能被4整除但不能被100整除或能被400整除的年份是闰年2.2.2 月份天数int getDaysInMonth(int year, int month) { if (month 4 || month 6 || month 9 || month 11) { return 30; } if (month 2) { return isLeapYear(year) ? 29 : 28; } return 31; }2.3 星期计算算法核心变量current_week记录每月1号是星期几0周一6周日每月13号的星期 (current_week 12) % 7下月1号的星期 (current_week 本月天数) % 7int current_week 0; // 1900年1月1日是周一 for (int year 1900; year 1900 n; year) { for (int month 1; month 12; month) { int week_13 (current_week 12) % 7; count[week_13]; current_week (current_week getDaysInMonth(year, month)) % 7; } }2.4 输出格式调整题目要求输出顺序是周六、周日、周一...周五。所以需要调整索引if (week_13 5) { // 周六 → 索引0 count[0]; } else if (week_13 6) { // 周日 → 索引1 count[1]; } else { // 周一(0)到周五(4) → 索引2-6 count[week_13 2]; }3. 地铁站移树问题解决方案3.1 问题建模将马路看作0到L的数轴每个整数点有一棵树。给出M个区间需要移除这些区间内的所有树最后统计剩余的树。3.2 算法实现使用标记数组法初始化一个长度为L1的布尔数组初始值为false表示树存在对每个区间[a,b]将a到b的位置标记为true表示树被移除最后统计仍为false的位置数量bool tree[10001] {false}; for (int i 0; i M; i) { int a, b; cin a b; if (a b) swap(a, b); for (int j a; j b; j) { tree[j] true; } } int remain 0; for (int j 0; j L; j) { if (!tree[j]) remain; }3.3 优化与边界情况注意当L10000且M100时最坏情况下需要处理100*100001,000,000次操作这在时间限制内是可接受的。特殊案例输入L10, M2, 区间[2,5]和[3,6]移除的树位置2,3,4,5,6剩余树0,1,7,8,9,10 → 共6棵4. 算法实现中的常见问题与解决方案4.1 整除尾数问题问题1忘记处理x为个位数时的前导零解决方案使用printf(%02d, weishu[i])保证输出两位数问题2整数溢出解决方案使用long long类型存储完整数字4.2 黑色星期五问题问题1星期计算错误解决方案确认1900年1月1日是周一索引从0开始问题2输出顺序混淆解决方案仔细阅读题目要求调整计数数组的输出顺序4.3 移树问题问题1区间端点大小不确定解决方案使用swap(a,b)确保a b问题2数组越界解决方案数组大小设为10001L最大100005. 编程技巧与最佳实践防御性编程处理输入时检查边界条件if (a 0 || a 10000) return -1;代码复用将常用功能封装为函数int days getDaysInMonth(year, month);测试用例设计边界值测试如L1, M0特殊值测试如b100时的整除问题大输入测试验证性能调试技巧使用小规模数据手工验证添加中间输出调试printf(Month %d: 13th is %d\n, month, week_13);在实际编程竞赛中这类问题的解决关键在于准确理解题目要求设计高效的算法处理各种边界情况编写清晰、可维护的代码通过这三个问题的练习可以很好地锻炼基础编程能力和算法思维。建议读者可以尝试自己实现这些算法并设计更多的测试用例来验证程序的正确性。