題目描述現代數學的著名證明之一是Georg Cantor證明了有理數是可枚舉的。他是用下面這一張表來證明這一命題的:
1/1 , 1/2 , 1/3, 1/4, 1/5, …
2/1, 2/2, 2/3, 2/4, …
3/1 , 3/2, 3/3, …
4/1, 4/2, …
5/1, ……
我們以Z字形給上表的每一項編號。第一項是1/1,然後是1/2,2/1,3/1,2/2,…
輸入輸出格式
輸入格式:
整數N(1≤N≤10000000)
輸出格式:
表中的第N項
輸入輸出樣例
輸入樣例#1:
7
輸出樣例#1:
1/4
模擬了半天才發現沒必要遞歸,寫的有些麻煩了。
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a = 1, b = 1, cnt = 1, c = 1;//a爲分子,b爲分母,cnt記錄層數,c爲編號
int main()
{
cin >> n;
while(1)
{
if (c == n)//編號和n相等時輸出
{
cout << a << "/" << b << endl;
break;
}
if (a == 1)//如果到達第一行邊界處
{
if (b % 2)//如果是奇數列
b++, cnt++, c++;//向下走,層數加一
else
a++, b--, c++;//否則向左下方走
}
else if (b == 1)//若到達第一列邊界處
{
if (a % 2)//如果行是奇數行
a--, b++, c++;//向右上方走
else
a++, cnt++, c++;//否則向右走,層數加一
}
else if (cnt % 2)//如果不在邊界處,若層數爲奇數
{
a--, b++, c++;//向右上方走
}
else
a++, b--, c++;//否則向左下方走
}
//system("pause");
return 0;
}
大佬的簡便方法:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n, cnt = 0, sum = 0;//cnt計算行層,sum計算每行結束時編號最大的值
cin >> n;
while (sum < n)//編號沒到n時繼續
{
cnt++;//層數加一
sum += cnt;//每層編號最大值加層數
}
if (cnt % 2)//奇數層
cout << sum - n + 1 << "/" << cnt - sum + n << endl; //最大值-n+1 / 層數-最大值+n
else//偶數層
cout << cnt - sum + n << "/" << sum - n + 1 << endl;//反過來
//system("pause");
return 0;
}