标签:
题目:按照三角形的形状摆放正整数(从1开始),递归的不断在原来的三角形的斜边上添加一条新边;
现在个你一个数字在这个构造中的序号,输出它的行列值。
分析:数学。第k个三角形包含前k(k+1)/ 2个元素,每次从左上角向下移动,横纵坐标之和为k+1;
计算出比n小的满足k(k+1)/ 2的k值,然后利用n - k(k+1)/ 2计算出位置即可。
说明:要使用long long,否则会溢出。
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using namespace std; long long bs(long long key) { long long l = 0,r = 2147483646; while (l < r) { int mid = (l+r+1)/2; if (0.5*mid*(mid+1) >= key) r = mid-1; else l = mid; } return l; } int main() { long long n,b,m; while (cin >> n) { m = bs(n); b = n - m*(m+1)/2; cout << m+2-b << "/" << b << endl; } return 0; }
标签:
原文地址:http://blog.csdn.net/mobius_strip/article/details/44682747