链接:https://ac.nowcoder.com/acm/contest/1069/I
来源:牛客网
题目描述
现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
![](https://i-blog.csdnimg.cn/blog_migrate/d5bc3c2b6b07f0f98d79a3161a338aeb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a9a37cc086242e5743e7a0e960fea030.png)
我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…
输入描述:
整数N(1≤N≤10000000)
输出描述:
表中的第N项
示例1
输出
复制1/4
题解:斜着看,每一斜逐渐增加1个数,奇数斜从下往上,偶数斜从上往下,暴力求包括到第几斜,从新的一斜开始。分奇数偶数情况讨论。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<stdio.h> #include<iostream> #include<algorithm> #include<cstring> #include<math.h> #include<string> #include<map> #include<queue> #include<stack> #include<set> #define ll long long #define inf 0x3f3f3f3f using namespace std; int a[10006]; int main() { memset(a,0,sizeof(a)); for(int i=1;i<=10000;i++) a[i]=a[i-1]+i; int n; scanf("%d",&n); int l,cha;///第几斜前是铺满的,新的一斜有几个数 for(int i=1;i<=10000;i++) { if(a[i]<=n && n<=a[i+1]) { l=i; cha=n-a[i]; break; } } int x,y; if(l%2)///第奇数斜,轮到第偶数斜,右上→左下 { if(cha==0) x=1,y=l; else { x=1; y=l+1; cha--; while(cha--) { x++; y--; } } } else { if(cha==0) x=l,y=1; else { x=l+1; y=1; cha--; while(cha--) { x--; y++; } } } printf("%d/%d\n",x,y); return 0; }
水题,拿来练习matlab。
a(1)=1; for i=2:1:10000 a(i)=a(i-1)+i; end n=input(''); l=0; cha=0; x=0; y=0; for i=1:1:10000 if a(i)<=n && n<=a(i+1) l=i; cha=n-a(i); break; end end if mod(l,2)==1 %matlab求模 if cha==0 x=1; y=l; else x=1; y=1+l; cha=cha-1; while cha>0 x=x+1; y=y-1; cha=cha-1; end end else if cha==0 x=l; y=1; else x=l+1; y=1; cha=cha-1; while cha>0 x=x-1; y=y+1; cha=cha-1; end end end fprintf('%d/%d\n',x,y);