白书练习 Cantor的数表

//
//  main.cpp
//  cantor的数表
//
//  Created by 张嘉韬 on 16/1/31.
//  Copyright © 2016年 张嘉韬. All rights reserved.
//

#include <iostream>
#include <cstring>
using namespace std;
int main(int argc, const char * argv[]) {
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int x,c,flag;
        x=1;
        while(1)
        {
            if(x*(x+1)/2==n||x*(x+1)/2>n) break;
            else x++;
        }
        if(x%2==0) flag=1;
        else flag=0;
        cout<<"x="<<x<<" ";
        c=n-x*(x-1)/2;
        cout<<"c="<<c<<" ";
        if(flag== 1) cout<<c<<"/"<<x-c+1<<endl;
        else cout<<x-c+1<<"/"<<c<<endl;
    }
    return 0;
}


总结:
1.在这道题的解决过程中,我们进一步发现了对于算法中数学的威力,首先在我们一开始对这个问题进行第一部抽象的时候我们就发现,如果我们能用清晰的数学语言(或者说逻辑语言)来描述我们要解决的问题,那么会对我们进一步进行下一步推理建立坚实的基础,所以我们去解决问题,应当尽量用清晰的数学语言来描述这个问题。
具体放倒这个题中,我们分为了三步解决这个问题,首先,我们要找到n所在的斜行x,然后找打n在x行所在的位数c,然后按照规则输出。
那么第一个问题,我们要找到x,我们就要对x有一个清晰的描述,经过思考我们产生的描述是这样的“sum(x)>=n>sum(x-1)”,然后根据这个描述我们就不难找到x了,所以我们从这道题中收获了一个解决问题的思路,要解决问题,我们先要用数学的语言清晰的描述出来,然后再进行解决。
2.数学抽象推理
我们对于该题目的第一种解法更像模拟,然而我们如果进一步发掘规律我们就会发现我们所要找的第n个数据就是第x行的倒数第sum(x)-n+1,所以经过展开,和推倒我们就可以直接计算我们的结果了,所以遇到具体的问题如果我们可以把他抽象成为数学问题,运用我们许多的数学工具去解决它。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值