当前位置:首页 > 技术 > 正文内容

C语言函数设计与递归应用实验

访客 技术 2026年6月20日 1

任务一:分数转等级函数

运行代码:

// 函数实现省略

问题解答:

  1. score_to_grade 函数将整数分数映射为字符等级;形参为 int,返回值为 char
  2. switch 语句缺少 break,则所有分数都执行 default,输出'E';另外,赋值字符应使用单引号而非双引号。

任务二:数字各位和计算

2.1 迭代实现

#include <stdio.h>

int sum_digits(int n);  

int main() {
    int n;
    int ans;

    while(printf("Enter n: "), scanf("%d", &n) != EOF) {
        ans = sum_digits(n);    
        printf("n = %d, ans = %d\n\n", n, ans);
    }

    return 0;
}

int sum_digits(int n) {
    int ans = 0;

    while(n != 0) {
        ans += n % 10;
        n /= 10;
    }

    return ans;
}

2.2 递归实现

// 递归实现略

问题解答:

  1. sum_digits 计算整数各位数字之和。
  2. 两种方法输出相同:迭代通过循环逐位提取数字累加;递归则不断取最后一位并递归处理剩余部分。

任务三:递归计算幂

#include <stdio.h>

int power(int x, int n);    

int main() {
    int x, n;
    int ans;

    while(printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF) {
        ans = power(x, n);  
        printf("n = %d, ans = %d\n\n", n, ans);
    }
    
    return 0;
}

int power(int x, int n) {
    int t;

    if(n == 0)
        return 1;
    else if(n % 2)
        return x * power(x, n-1);
    else {
        t = power(x, n/2);
        return t*t;
    }
}

问题解答:

  1. power 计算 x 的 n 次幂。
  2. 该函数为递归实现。

任务四:孪生素数检测

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

int is_prime(int n){
    if(n <= 1) return 0;
    if(n == 2) return 1;
    if(n % 2 == 0) return 0;
    for(int i = 3; i * i <= n; i += 2){
        if(n % i == 0) return 0;
    }
    return 1;
}

int main(){
    int cnt = 0;
    printf("100以内的孪生素数:\n");
    for(int n = 2; n <= 98; n++){
        if(is_prime(n) && is_prime(n + 2)){
            printf("%d %d\n", n, n + 2);
            cnt++;
        }
    }
    printf("100以内的孪生素数共有%d个。\n", cnt);
    return 0;
}

任务五:组合数计算

迭代实现

#include <stdio.h>

int func(int n, int m);  

int main() {
    int n, m;
    int ans;

    while(scanf("%d%d", &n, &m) != EOF) {
        ans = func(n, m);   
        printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
    }
        
    return 0;
}

int func(int n, int m){
    int numerator = 1, denom1 = 1, denom2 = 1;
    for(int x = 1; x <= n; ++x) numerator *= x;
    for(int y = 1; y <= m; ++y) denom1 *= y;
    for(int z = 1; z <= (n - m); ++z) denom2 *= z;
    return numerator / (denom1 * denom2);
}

递归实现

#include <stdio.h>

int func(int n, int m);   

int main() {
    int n, m;
    int ans;

    while(scanf("%d%d", &n, &m) != EOF) {
        ans = func(n, m);   
        printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
    }
        
    return 0;
}

int func(int n, int m){
    if(n < m) return 0;
    else if(m == 0 || m == n) return 1;
    else return func(n - 1, m) + func(n - 1, m - 1);
}

任务六:三个数的最大公约数

#include <stdio.h>

int gcd(int a, int b, int c);

int main(){
    int a, b, c;
    int ans;

    while(scanf("%d%d%d", &a, &b, &c) != EOF) {
        ans = gcd(a, b, c);   
        printf("最大公约数: %d\n\n", ans);
    }

    return 0;
}

int gcd(int a, int b, int c){
    int min = a;
    if(b < min) min = b;
    if(c < min) min = c;
    for(int i = min; i >= 1; --i){
        if(a % i == 0 && b % i == 0 && c % i == 0){
            return i;    
        }
    }
}

任务七:输出字符图案

#include <stdio.h>
#include <stdlib.h>

void print_charman(int n);

int main() {
    int n;
    printf("input n: ");
    scanf("%d", &n);
    print_charman(n);
    return 0;
}

void print_charman(int n) {
    for(int i = 1; i <= n; ++i){
        int width = 2 * (n - i + 1) - 1;
        for(int j = 0; j < i; ++j) printf("\t");
        for(int j = 0; j < width; ++j) printf(" O\t");
        printf("\n");
        for(int j = 0; j < i; ++j) printf("\t");
        for(int j = 0; j < width; ++j) printf("<H>\t");
        printf("\n");
        for(int j = 0; j < i; ++j) printf("\t");
        for(int j = 0; j < width; ++j) printf("I I\t");
        printf("\n");
    }
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。