头歌作业 函数

 1

题目描述
本关任务:m 个人的成绩存放在 score 数组中,请编写函数 fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的人数放在 below 所指的数组中。

注意:请勿改动主函数main和其它函数中的任何内容,仅在函数 fun 中填入你编写的若干语句。

输入格式
个人成绩数组。

输出格式
低于平均分的成绩。

输入输出样例
输入1
10 20 30 40 50 60 70 80 90

输出1
10 20 30 40

#include 
#include 

int fun(int score[], int m, int below[]) {
    int sum = 0, count = 0; // 用于计算总和和低于平均分的人数
    double ave; // 使用double类型以提高精度

    // 计算总分和平均分
    for (int i = 0; i < m; i++) {
        sum += score[i];
    }
    ave = (double)sum / m;

    // 找出低于平均分的成绩,并放入below数组
    for (int i = 0; i < m; i++) {
        if (score[i] < ave) {
            below[count++] = score[i]; // 将低于平均分的成绩存入数组
        }
    }

    return count; // 返回低于平均分的人数
}

int main() {
    int i, n, below[9];
    int score[9];

    for (i = 0; i < 9; i++) {
        scanf("%d", &score[i]);
    }
    n = fun(score, 9, below);
    for (i = 0; i < n; i++) {
        printf("%d ", below[i]);
    }
    printf("\n");
    return 0;
}

2

工地有 n 块砖头需要搬运,但由于重量限制,每次只能搬 1 块或者 2 块,你能帮工地计算下能有多少种不同的搬运方法吗?

测试举例
输入
3

输出
3

#include 

int main() {
    int n, i;
    scanf("%d", &n); 
    if (n == 0) {
        printf("0\n");
        return 0;
    } else if (n == 1) {
        printf("1\n");
        return 0;
    }

    
    int dp[1001] = {0};
    dp[0] = 1;
    dp[1] = 1; 
    
    for (i = 2; i <= n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }

    // 输出结果
    printf("%d\n", dp[n]);
    return 0;
}

3

孔融没有兄弟姐妹,到了周末,就找堂兄孔明、堂姐孔茹、堂弟孔伟等7个堂兄妹来到家里玩。孔融妈妈买了8个梨给孩子们吃,结果小黄狗桐桐淘气叼走了一个,大花猫鑫鑫偷偷藏了一个。孔融抢过剩下的6个梨,妈妈止住他,说他要和大家平分吃。孔融不高兴,说8个人怎么分6个梨?妈妈说可以用分数解决这个问题。孔融学过分数,说把每个梨切8个相等的块,每个人拿6块就行了。妈妈说不用切那么多块,每个梨切4个相等的块,每个人拿3块正好。孔融糊涂了。孔明说,我来教你。于是孔明给孔融讲起了分数的化简。
分数化简要化简到最简形式,比如12/20可以化简成6/10和3/5,但3/5是最简形式;100/8可以化简成 50 /4和 25 /2 , 而25/2 为最简形式。为了降低难度,不要求将假分数(如7/2)化简成带分数(3 )形式。请编程帮助孔融将任意一个分数化简成最简形式。先从键盘输入两个整数m和n(1<=m,n<=10000) ,其中m表示分子,n表示分母。然后输出分数化简后的最简形式。
函数原型:int Gcd(int a, int b);
函数功能:计算a和b的最大公约数,输入数据超出有效范围时返回-1。

#include 

int Gcd(int a, int b);

int main(void) {
    int m, n, f;
    scanf("%d,%d", &m, &n);
    f = Gcd(m, n);
    if (f != -1) {
        printf("%d/%d\n", m / f, n / f);
    } else {
        printf("Input error!\n");
    }
    return 0;
}

int Gcd(int a, int b) {
    int r;
    if (a <= 0 || b <= 0 || a > 10000 || b > 10000) {
        return -1;
    }
    while (b != 0) {
        r = b;
        b = a % b;
        a = r;
    }
    return a;
}

4

求兔子问题。第1个月有1对兔子,每对兔子从出生后第3个月起,就可每个月生1对兔子。问第n个月有多少对兔子?

#include 

int fib(int n) { 
    if (n == 1 || n == 2) {
        return 1;
    } else {
        return fib(n - 1) + fib(n - 2);
    }
}

int main(void) { 
    int i, n;
    scanf("%d", &n);
    for (i = 1; i <= n; i++) { 
        if ((i - 1) % 4 == 0) printf("\n");
        printf("%5d只兔子", fib(i));
    }
    printf("\n");
    return 0;
}

5

两个自然数,计算其和,如果输入的答案正确,则显示“right!”,否则提示重做,显示“Not correct! Try again!”;最多给三次机会,如果三次仍未做对,显示“Not correct! You have tried three times! Test over!”,程序结束。
输入输出样例1:
输入:
10,30
40
输出:
Input a, b:
10+30=Right!

输入输出样例2:
输入:
100,200
200
400
300
输出:
Input a, b:
100+200=Not correct. Try again!
100+200=Not correct. Try again!
100+200=Right!

#include 
	int Add(int a, int b)
	{
	   int sum;
       printf("%d+%d=",a,b);
        scanf("%d",&sum);
       return sum == a + b;
	}
	void Print(int flag, int chance)
	{
	   if (flag)
	      printf("Right!\n");
	   else if(chance < 3)
	      printf("Not correct. Try again!\n");
	   else
	      printf("Not correct. You have tried three times!\nTest over!\n");
	}
	int main()
	{
	   int  a, b, answer, chance;
	   printf("Input a, b:\n");
	   scanf("%d,%d", &a, &b);
	   chance = 0;
	   do
	   {
	      answer = Add(a, b);
	      chance++;
	      Print(answer, chance);
	   } while ((!answer) && (chance < 3));
	   return 0;
	}

6

从键盘输入一个班(全班最多不超过30人)学生的某门课的成绩,当输入成绩为负值时,输入结束,统计不及格人数并打印不及格学生名单。
输入输出样例:
输入:
202201 70
202202 80
202203 90
202204 60
-1 -1

输出:
Please enter num and score until score<0:
Total students:4

#include 

int main() {
    int num;          // 学号
    int score;        // 成绩
    int count = 0;    // 学生总数
    int fail_count = 0; // 不及格人数

    printf("Please enter num and score until score<0:\n");

    // 输入学号和成绩
    while (1) {
        scanf("%d %d", &num, &score);

        // 如果成绩为负值,结束输入
        if (score < 0) {
            break;
        }

        // 如果成绩不及格,记录不及格人数
        if (score < 60) {
            fail_count++;
        }

        count++; // 总学生数增加
    }

    // 输出总学生数
    printf("Total students:%d\n", count);

    return 0;
}

7

输入整数数组 arr ,找出其中最小的 k 个数

输入输出格式
输入格式
第一行有一个整数 numsSize,表示数组 nums 的大小;
第二行有 numsSize 个整数,表示数组 nums 的所有元素,每个整数用一个空格隔开。
第三行输入 k 的值

输出格式
一行输出数组 nums 的所有元素,有 numsSize 个整数,每个整数用一个空格隔开。

输入输出样例1
输入
3
1 2 3
2
输出
1 2 

#include 

// 快速选择算法的分区函数
int partition(int arr[], int low, int high) {
    int pivot = arr[high];
    int i = low;
    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
        }
    }
    int temp = arr[i];
    arr[i] = arr[high];
    arr[high] = temp;
    return i;
}

// 快速选择算法
void quickSelect(int arr[], int low, int high, int k) {
    if (low < high) {
        int pivotIndex = partition(arr, low, high);
        if (pivotIndex == k - 1) return;
        if (pivotIndex > k - 1) quickSelect(arr, low, pivotIndex - 1, k);
        else quickSelect(arr, pivotIndex + 1, high, k);
    }
}

int main() {
    int numsSize, k;
    scanf("%d", &numsSize);
    int arr[100]; // 假设数组大小不超过100
    for (int i = 0; i < numsSize; i++) {
        scanf("%d", &arr[i]);
    }
    scanf("%d", &k);

    // 确保k在有效范围内
    if (k < 1 || k > numsSize) {
        printf("Invalid k value.\n");
        return 1;
    }

    // 使用快速选择算法找出最小的k个数
    quickSelect(arr, 0, numsSize - 1, k);

    // 打印最小的k个数
    for (int i = 0; i < k; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

8

你可能感兴趣的:(算法)