CSES入门题:数字螺旋计算结果不符的错误排查与修复求助
数字螺旋问题的计算错误修复
问题场景
在解决数字螺旋问题时,输入坐标956420707 85755464时,代码输出结果为914740568692624386,但正确预期输出是914740566951293900。手动计算结果和代码输出一致,说明核心的公式推导存在错误。
原逻辑的问题
原推导的公式忽略了数字螺旋的奇偶行/列方向差异:
- 原逻辑认为
(n,n)处的值是n² -n +1,并统一用该值加上row-column得到结果 - 但实际上数字螺旋的填充方向会随行/列的奇偶性变化:
- 奇数行(行号≥列号):从右向左递减,
(row, row)的值是row²,(row, column)的正确值为row² - column +1 - 偶数行(行号≥列号):从左向右递增,
(row, row)的值是(row-1)² +1,(row, column)的正确值为(row-1)² + column - 奇数列(列号>行号):从上向下递增,
(column, column)的值是(column-1)² +1,(row, column)的正确值为(column-1)² + row - 偶数列(列号>行号):从下向上递减,
(column, column)的值是column²,(row, column)的正确值为column² - row +1
- 奇数行(行号≥列号):从右向左递减,
原公式没有区分这些情况,导致大数值计算时出现偏差。
修复后的代码
#include <iostream> using namespace std; long long square(long long x) { return x * x; } int main() { long long test_count; cin >> test_count; while (test_count--) { long long row, col, val; cin >> row >> col; if (row >= col) { if (row % 2 == 1) { val = square(row) - col + 1; } else { val = square(row - 1) + col; } } else { if (col % 2 == 1) { val = square(col - 1) + row; } else { val = square(col) - row + 1; } } cout << val << endl; } return 0; }
验证说明
对于输入956420707 85755464:
- 行号
956420707是奇数且大于列号,代入公式row² - col +1 - 计算后结果与预期输出
914740566951293900一致
内容的提问来源于stack exchange,提问作者Dhyey Patel
相关产品推荐
相关产品推荐

