A1040. Cantor表
问题描述
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,然后是1/2,2/1,3/1,2/2...
你的任务是求表中第N项的值。
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,然后是1/2,2/1,3/1,2/2...
你的任务是求表中第N项的值。
输入格式
输入仅一个正整数n(1<=n<=100000)
输出格式
以分数形式输出表中的第n项(不用约分)
样例输入
7
样例输出
1/4
package www.tsinsen.com; import java.util.Scanner; public class A1040 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan=new Scanner(System.in); int n=scan.nextInt(); //返回它是第几斜列 int lie=find(n); //求在所在斜列的第几个 int num=n-((lie)*(lie-1))/2; String str=""; //如果是奇数行从下到上 if(lie%2==1) { str=(lie-num+1)+"/"+num; } //如果是偶数行从上到下 else if(lie%2==0) { str=num+"/"+(lie-num+1); } System.out.println(str); } public static int find(int n) { for(int i=1;i<n;i++) { if(i*(i+1)/2>=n) { return i; } } return n; } }