天梯初级练习题目 6-31 ~ 6-40 含全部测试点

6-31 字符串的连接 分数 15

本题要求实现一个函数,将两个字符串连接起来。

函数接口定义:

char *str_cat( char *s, char *t );

函数str_cat应将字符串t复制到字符串s的末端,并且返回字符串s的首地址。

裁判测试程序样例:

#include <stdio.h>
#include <string.h>

#define MAXS 10

char *str_cat( char *s, char *t );

int main()
{
    char *p;
    char str1[MAXS+MAXS] = {'\0'}, str2[MAXS] = {'\0'};
    
    scanf("%s%s", str1, str2);
    p = str_cat(str1, str2);
    printf("%s\n%s\n", p, str1);
    
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

abc
def

输出样例:

abcdef
abcdef

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <stdlib.h>
char* str_cat(char* s, char* p)
{
    char* res = malloc(sizeof(s) + sizeof(p) + 1);
    int i = 0, j = 0;
    for(i = strlen(s); p[j]; ++ j, ++ i) s[i] = p[j];
    s[i] = '\0';
    return s;
}

6-32 函数实现字符串逆序 分数 15

本题要求实现一个字符串逆序的简单函数。

函数接口定义:

void f( char *p );

函数fp指向的字符串进行逆序操作。要求函数f中不能定义任何数组,不能调用任何字符串处理函数。

裁判测试程序样例:

#include <stdio.h>
#define MAXS 20

void f( char *p );
void ReadString( char *s ); /* 由裁判实现,略去不表 */

int main()
{
    char s[MAXS];
    
    ReadString(s);
    f(s);
    printf("%s\n", s);
    
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

Hello World!

输出样例:

!dlroW olleH

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

void f(char* p)
{
    int j = strlen(p) - 1;
    for(int i = 0; i <= j >> 1; ++ i)
    {
        char c = p[j - i];
        p[j - i] = p[i];
        p[i] = c;
    }
}

6-33 计算两个复数之积 分数 15

本题要求实现一个计算复数之积的简单函数。

函数接口定义:

struct complex multiply(struct complex x, struct complex y);

其中struct complex是复数结构体,其定义如下:

struct complex{ 
    int real; 
    int imag; 
};

裁判测试程序样例:

#include <stdio.h>

struct complex{
    int real;
    int imag;
};

struct complex multiply(struct complex x, struct complex y);

int main()
{
    struct complex product, x, y;

    scanf("%d%d%d%d", &x.real, &x.imag, &y.real, &y.imag);
    product = multiply(x, y);
    printf("(%d+%di) * (%d+%di) = %d + %di\n", 
            x.real, x.imag, y.real, y.imag, product.real, product.imag);
    
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

3 4 5 6

输出样例:

(3+4i) * (5+6i) = -9 + 38i

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

typedef struct complex cp;
cp multiply(cp x, cp y)
{
    cp res;
    int a = x.real, b = x.imag, c = y.real, d = y.imag;
    res.real = a * c - b * d, res.imag = a * d + b * c;
    return res;
}

6-34 按等级统计学生成绩 分数 20

本题要求实现一个根据学生成绩设置其等级,并统计不及格人数的简单函数。

函数接口定义:

int set_grade( struct student *p, int n );

其中p是指向学生信息的结构体数组的指针,该结构体的定义为:

struct student{
    int num;
    char name[20];
    int score;
    char grade;
};

n是数组元素个数。学号num、姓名name和成绩score均是已经存储好的。set_grade函数需要根据学生的成绩score设置其等级grade。等级设置:85-100为A,70-84为B,60-69为C,0-59为D。同时,set_grade还需要返回不及格的人数。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 10

struct student{
    int num;
    char name[20];
    int score;
    char grade;
};

int set_grade( struct student *p, int n );

int main()
{   struct student stu[MAXN], *ptr;
    int n, i, count;
    
    ptr = stu;
    scanf("%d\n", &n);
    for(i = 0; i < n; i++){
       scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
    } 
   count = set_grade(ptr, n);
   printf("The count for failed (<60): %d\n", count);
   printf("The grades:\n"); 
   for(i = 0; i < n; i++)
       printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

10
31001 annie 85
31002 bonny 75
31003 carol 70
31004 dan 84
31005 susan 90
31006 paul 69
31007 pam 60
31008 apple 50
31009 nancy 100
31010 bob 78

输出样例:

The count for failed (<60): 1
The grades:
31001 annie A
31002 bonny B
31003 carol B
31004 dan B
31005 susan A
31006 paul C
31007 pam C
31008 apple D
31009 nancy A
31010 bob B

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

typedef struct student st;
int set_grade(st* p, int n)
{
    int cnt = 0;
    for(int i = 0; i < n; ++ i)
    {
        if(p[i].score >= 85) p[i].grade = 'A';
        else if(p[i].score >= 70) p[i].grade = 'B';
        else if(p[i].score >= 60) p[i].grade = 'C';
        else p[i].grade = 'D', cnt ++;
    }
    return cnt;
}

6-35 使用递归函数计算1到n之和 分数 10

本题要求实现一个用递归计算1+2+3+…+n的和的简单函数。

函数接口定义:

int sum( int n );

该函数对于传入的正整数n返回1+2+3+…+n的和;若n不是正整数则返回0。题目保证输入输出在长整型范围内。建议尝试写成递归函数。

裁判测试程序样例:

#include <stdio.h>

int sum( int n );

int main()
{
    int n;

    scanf("%d", &n);
    printf ("%d\n", sum(n));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

10

输出样例1:

55

输入样例2:

0

输出样例2:

0

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

int sum(int n)
{
    if(n <= 0) return 0;
    return sum(n - 1) + n;
}

6-36 递归计算Ackermenn函数 分数 15

本题要求实现Ackermenn函数的计算,其函数定义如下:

函数接口定义:

int Ack( int m, int n );

其中mn是用户传入的非负整数。函数Ack返回Ackermenn函数的相应值。题目保证输入输出都在长整型

范围内。

裁判测试程序样例:

#include <stdio.h>

int Ack( int m, int n );

int main()
{
    int m, n;
    
    scanf("%d %d", &m, &n);
    printf("%d\n", Ack(m, n));
    
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

2 3

输出样例:

9

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

int Ack(int m, int n)
{
    if(!m) return n + 1;
    else if(!n) return Ack(m - 1, 1);
    return Ack(m - 1, Ack(m, n - 1));
}

6-37 递归实现指数函数 分数 15

本题要求实现一个计算xn(n≥1)的函数。

函数接口定义:

double calc_pow( double x, int n );

函数calc_pow应返回xn次幂的值。建议用递归实现。题目保证结果在双精度范围内。

裁判测试程序样例:

#include <stdio.h>

double calc_pow( double x, int n );

int main()
{
    double x;
    int n;

    scanf("%lf %d", &x, &n);
    printf("%.0f\n", calc_pow(x, n));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

2 3

输出样例:

8

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

double calc_pow(double a, int b)
{
    double res = 1;
    while(b)
    {
        if(b & 1) res = res * a;
        a = a * a;
        b >>= 1;
    }
    return res;
}

6-38 递归求Fabonacci数列 分数 10

本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:

f(n)=f(n−2)+f(n−1) (n≥2),其中f(0)=0,f(1)=1。

函数接口定义:

int f( int n );

函数f应返回第n个Fabonacci数。题目保证输入输出在长整型范围内。建议用递归实现。

裁判测试程序样例:

#include <stdio.h>

int f( int n );

int main()
{
    int n;
    
    scanf("%d", &n);
    printf("%d\n", f(n));
    
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

6

输出样例:

8

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

int f(int n)
{
    if(n <= 0) return 0;
    if(n == 1 || n == 2) return 1;
    return f(n - 1) + f(n - 2);
}

6-39 递归实现顺序输出整数 分数 15

本题要求实现一个函数,对一个整数进行按位顺序输出。

函数接口定义:

void printdigits( int n );

函数printdigits应将n的每一位数字从高位到低位顺序打印出来,每位数字占一行。

裁判测试程序样例:

#include <stdio.h>

void printdigits( int n );

int main()
{
    int n;
    
    scanf("%d", &n);
    printdigits(n);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

12345

输出样例:

1
2
3
4
5

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

void  printdigits(int n)
{
    int stk[10], idx = -1;
    do stk[++ idx] = n % 10; while(n /= 10);
    while(idx != -1) printf("%d\n", stk[idx --]);
}

6-40 判断满足条件的三位数 分数 15

本题要求实现一个函数,统计给定区间内的三位数中有两位数字相同的完全平方数(如144、676)的个数。

函数接口定义:

int search( int n );

其中传入的参数int n是一个三位数的正整数(最高位数字非0)。函数search返回[101, n]区间内所有满足条件的数的个数。

裁判测试程序样例:

#include <stdio.h>
#include <math.h>

int search( int n );

int main()
{
    int number;

    scanf("%d",&number);
    printf("count=%d\n",search(number));
        
    return 0;
}


/* 你的代码将被嵌在这里 */

输入样例:

500

输出样例:

count=6

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

int check(int n)
{
    return (int)sqrt(n) * (int)sqrt(n) == n;
}

int search(int n)
{
    int cnt = 0;
    for(int i = 101; i <= n; ++ i)
        if(check(i))
        {
            int a = i / 100, b = i / 10 % 10, c = i % 10;
            if(a == b || a == c || b == c && !(a == b && b == c)) cnt ++;
        }
    return cnt;
}

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值