码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 880 - Cantor Fractions

时间:2015-03-27 22:15:23      阅读:194      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!