Cantor表-(模拟)
链接:https://ac.nowcoder.com/acm/contest/1069/I
来源:牛客网
题目描述
现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…
输入描述:
整数N(1≤N≤10000000)
输出描述:
表中的第N项
示例1
输出
复制1/4
题解:斜着看,每一斜逐渐增加1个数,奇数斜从下往上,偶数斜从上往下,暴力求包括到第几斜,从新的一斜开始。分奇数偶数情况讨论。
#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);

浙公网安备 33010602011771号