白书练习 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,所以经过展开,和推倒我们就可以直接计算我们的结果了,所以遇到具体的问题如果我们可以把他抽象成为数学问题,运用我们许多的数学工具去解决它。

你可能感兴趣的:(白书练习 Cantor的数表)