问题 E: Cantor表
时间限制: 1 Sec 内存限制: 125 MB
提交: 18 解决: 10
[状态] [提交] [命题人:外部导入]
题目描述
现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…
输入
每个测试文件只包含一组测试数据,每组输入一个正整数N(1≤N≤10000000)。
输出
对于每组输入数据,输出表中的第N项。
样例输入
7样例输出
1/4
没啥说的,就是个看规律的题,注意是偶数还是奇数行,可能能优化吧
#include<bits/stdc++.h>
using namespace std;
int main(){
int num;
cin>>num;
if(num==1){
cout<<"1/1";return 0;
}
int i=1;
for(;;++i){
if( (i+1)*i/2>num )
break;
}
int f = num - (i-1)*i/2;//第几个
if(f!=0){
if(i%2==1){
cout<<(i+1)-f<<"/"<<f;
}else{
cout<<f<<"/"<<(i+1)-f;
}
}else{
if(i%2==1){
cout<<i-1<<"/"<<1;
}else{
cout<<1<<"/"<<i-1;
}
}
}