题意理解
按照从右上到左下的斜对角来看,每条对角线可以分成1个数字、2个数字、3个数字……
2
3
4
5
对于一个n,我们可以先找出来是在第几层的,1是第一层,2-3是第二层,4-6是第三层
层数 | 标号 |
---|---|
1 | 1 |
2 | 2-3 |
3 | 4-6 |
4 | 5-10 |
那么显然,
k∗(k−1)2<n≤(k+1)∗k2
时,有第
n
个表达式在第
其实这时候可以二分一波,也可以暴力一波。当然也可以打表。
奇数层从下往上数,偶数层从上往下数。每层数左右两个数字加起来是层数+1。
代码
#include <cstring>
#include <iostream>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iomanip>
#include <vector>
using namespace std;
const int maxn = 5000;
int steps[maxn];
void init() {
for(int i = 0; i < maxn; i++) {
steps[i] = i * (i + 1) / 2;
}
}
int main() {
init();
int n;
cin >> n;
int layer = 0;
for(int i = 0; i < maxn; i++) {
if(n <= steps[i]) {
layer = i;
break;
}
}
int left, right;
if(layer % 2 == 0) {
left = n - (layer - 1) * layer / 2;
right = layer + 1 - left;
} else {
right = n - (layer - 1) * layer / 2;
left = layer + 1 - right;
}
printf("%d/%d", left, right);
return 0;
}
欢迎加入“不会算法一群菜鸟”,群号是⑥⑥①⑨②2025,这是我设置的一道很低的门槛用来阻止广告的。入群的验证暗号是:我爱编译原理