zoukankan      html  css  js  c++  java
  • 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

    输入

    复制
    7

    输出

    复制
    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
    ",x,y);
        return 0;
    }
    c++版本

    水题,拿来练习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
    ',x,y);
                
    

      




  • 相关阅读:
    动手动脑3
    AWK编程与应用
    BASH内置变量的使用
    服务器交互脚本expect
    编程对话框的界面程序
    每日打卡
    AppiumLibrary中文翻译
    Bootstrap4简单使用
    Python基础06-类与对象
    BDD模式-Python behave的简单使用
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/11259258.html
Copyright © 2011-2022 走看看