题目:按照三角形的形状摆放正整数(从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