• SDUT-3331_数据结构实验之链表八:Farey序列


    数据结构实验之链表八:Farey序列

    Time Limit: 10 ms Memory Limit: 600 KiB

    Problem Description

    Farey序列是一个这样的序列:其第一级序列定义为(0/1,1/1),这一序列扩展到第二级形成序列(0/1,1/2,1/1),扩展到第三极形成序列(0/1,1/3,1/2,2/3,1/1),扩展到第四级则形成序列(0/1,1/4,1/3,1/2,2/3,3/4,1/1)。以后在每一级n,如果上一级的任何两个相邻分数a/c与b/d满足(c+d)<=n,就将一个新的分数(a+b)/(c+d)插入在两个分数之间。对于给定的n值,依次输出其第n级序列所包含的每一个分数。

    Input

    输入一个整数n(0<n<=100)

    Output

    依次输出第n级序列所包含的每一个分数,每行输出10个分数,同一行的两个相邻分数间隔一个制表符的距离。

    Sample Input

    6

    Sample Output

    0/1 1/6 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4
    4/5 5/6 1/1

    链表的插入操作,当第一层需要手动输入,剩下的按照题目要求开辟节点插入就可以了。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    typedef struct node
    {
        int num1,num2;
        struct node *next;
    }link;
    
    link *newlink()
    {
        link *t;
        t = (link*)malloc(sizeof(link));
        t->next = NULL;
        return t;
    }
    
    link *create(int n)
    {
        int i;
        link *head,*p,*q,*r;
        head = newlink();
        for(i=1;i<=n;i++)
        {
            if(i==1)
            {
                p = newlink();
                p->next = NULL;
                p->num1 = 0;
                p->num2 = 1;
                head->next = p;
                p = newlink();
                p->next = NULL;
                p->num1 = 1;
                p->num2 = 1;
                head->next->next = p;
            }
            else
            {
                p = head->next;
                while(p->next)
                {
                    q = p->next;
                    if(p->num2+q->num2<=i)
                    {
                        r = newlink();
                        r->num1 = p->num1 + q->num1;
                        r->num2 = p->num2 + q->num2;
                        r->next = p->next;
                        p->next = r;
                    }
                    p = p->next;
                }
            }
        }
        return head;
    }
    
    void show(link *head)
    {
        link *p;
        int k = 1;
        p = head->next;
        while(p)
        {
            printf("%d/%d",p->num1,p->num2);
            if(k%10==0||p->next==NULL)
                printf("
    ");
            else
                printf("	");
            k++;
            p = p->next;
        }
    }
    
    int main()
    {
        int n;
        link *head;
        scanf("%d",&n);
        head = create(n);
        show(head);
        return 0;
    }
    
  • 相关阅读:
    Linux oracle操作
    Job
    Oracle创建表空间和用户并分配权限
    Oracle赋予用户查询另一个用户所有表的权限
    plsql中文乱码解决方案
    PLSQL创建Oracle定时任务,定时执行存储过程
    fcntl函数参数F_GETPIPE_SZ、F_SETPIPE_SZ报错引出的关于linux-specific头文件的使用方法
    从Windows Server 2008 迁移mantis到CentOS 6.8
    从Windows Server 2008 迁移VisualSVN到CentOS 6.8
    CentOS 6.8上开启NFS服务给不同用户使用的曲线设置方法
  • 原文地址:https://www.cnblogs.com/luoxiaoyi/p/9726735.html
Copyright © 2020-2023  润新知