首页 > 其他 > 详细

UVa 880 - Cantor Fractions

时间:2015-03-27 22:13:46      阅读:245      评论:0      收藏:0      [点我收藏+]

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



UVa 880 - Cantor Fractions

原文:http://blog.csdn.net/mobius_strip/article/details/44682747

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!