PAT习题6-6

习题6-4 使用函数输出指定范围内的Fibonacci数

本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数mn(0<mn≤10000)之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。

int fib(int n)
{
    int sum=0;
    if(n==1||n==2)
        sum+=1;
    else
        sum+=fib(n-2)+fib(n-1);
    return sum;
}
void PrintFN(int m,int n)
{
    int i=1;
    int flag=1;//最后一个数后没有空格 
    int count=0;//判断是否有 Fibonacci数在区间内 
    while(fib(i)<m)
    {
        i++;
    }
    while(fib(i)<=n)
    {
        if(flag)
        {
            printf("%d",fib(i));
            flag=0;
        }
        else
        {
            printf(" %d",fib(i));
        }
            count++;
            i++;        
    }
    if(count==0)
    {
        printf("No Fibonacci number\n");
    }
}

习题6-6 本题要求实现一个求整数的逆序数的简单函数。

int reverse(int number)
{
    int t=0;
    while(number!=0)
    {
        t=t*10+number%10;
        number=number/10;
    }
    return t;
}

习题8-1拆分实数的整数和小数部分

void splitfloat( float x, int *intpart, float *fracpart )
{
    *intpart=(int)x;
    *fracpart=x-(*intpart);
}

练习8-8 移动字母

本题要求编写函数,将输入字符串的前3个字符移到最后。

void Shift(char s[])
{
    int len=strlen(s);
    char tp_s[3]; 
    for(int i=0;i<3;i++)
        tp_s[i]=s[i];	//先存前三个元素
    for(int i=3;i<len;i++)
        s[i-3]=s[i];	//再剩余元素前移
    for(int i=0;i<3;i++)
        s[len-3+i]=tp_s[i]; //前三个元素到正确位置
}
//思路2
void Shift( char s[] ){
    int n=strlen(s);
    char temp;
    for(int i=0;i<=2;i++){
        temp=s[0]; //每次记首元素
        for(int j=0;j<n-1;j++){
            s[j]=s[j+1]; //元素前移
        }
        s[n-1]=temp; //首元素插入
    }
}

习题8-3 数组循环右移

本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a0a1⋯a**n−1)变换为(a**nma**n−1a0a1⋯a**nm−1)(最后m个数循环移至最前面的m个位置)。

void ArrayShift(int a[],int n,int m)
{
    while(m--)  //循环次数
    {
        int temp=a[n-1]; //保存最后一位
        for(int i=n-2;i>=0;i--)
            a[i+1]=a[i];
        a[0]=temp;
    }
}

习题8-4 报数

报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。其中n是初始人数;m是游戏规定的退出位次(保证为小于n的正整数)。函数CountOff将每个人的退出顺序编号存在数组out[]中。因为C语言数组下标是从0开始的,所以第i个位置上的人是第out[i-1]个退出的。

void CountOff( int n, int m, int out[] )
{
    int b[n];
 
    for(int i=0; i<n; i++)
        b[i]=i+1;
 
    int i=0, j=0, idx=0;
    //j是计数器,idx是退出顺序
    while(1)
    {
        if(b[i]!=0) j++;
        if(j==m)
        {
            out[i]=++idx;
            b[i]=j=0;
        }
        i++;
        if(i>=n) i=0;
        if(idx==n) break;  //全部退出后
    }
}
void CountOff( int n, int m, int out[] ){
    int a[MAX], count = 1,index = 0;
    for (int i=0;i<n;i++) 
        a[i] = i+1;//为每个人编号,下标加1
    while(count <= n){//判断全部报数
        for(int i = 0;i<n;i++){//一个一个报数排除
            if (a[i] != 0) {  //还在圈中
                index++;//报一次数
                if (index == m) {//每报到m次,该人出局
                    out[i] = count++;
                    a[i]=0;//将编号设置为0
                    index = 0;//将计数器归零
                }
            }
        }     
    }
}

输入样例 11 3

输出样例 4 10 1 7 5 2 11 9 3 6 8

这题输出很多人看不懂,注意输出说的是 out[i] 对应的该人是第几个输出的。

[(93条消息) 浙大版《C语言程序设计(第3版)》题目集 - 习题8-4 报数(20 分)_放羊的牧码的博客-CSDN博客](https://blog.csdn.net/Dream_Weave/article/details/84940199?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight 124 这位大神的写的就比较一目了然,而且精简 125 */ 复制代码 分类: 【PAT】【个人练习】浙大版《C语言程序设计(第3版)》题目集 标签: 练习 , PAT , C 好文要顶 关注我 收藏该文 行行行行行行行 粉丝 - 0 关注 - 1 +加关注 00 « 上一篇: 习题8-3 数组循环右移 (20分) » 下一篇: 习题8-5 使用函数实现字符串部分复制 (20分) posted @ 2020-07-05 16:00 行行行行行行行 阅读(534) 评论(0) 编辑 收藏 举报 刷新评论刷新页面返回顶部)

习题8-5 使用函数实现字符串部分复制

本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。

函数接口定义:

void strmcpy( char *t, int m, char *s );

函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。

void strmcpy(char *t, int m, char *s)
{
    int len = 0; //计算字符串t的长度 不包括最后的'\0'
    char *p = t;
    int i;
    while (*p != '\0')
    {
        len++;
        p++;
    }
    free(*p);
    if (m <= len)
    {
        for (i = 0; t[m - 1 + i] != '\0'; i++)
        {
            s[i] = t[m - 1 + i];
        }
        s[i] = '\0';
    }
    else
    {
        *s = '\0';
    }
}
posted @ 2023-05-14 17:13  小黑山羊  阅读(285)  评论(0)    收藏  举报