C语言Mooc,代码+解释(注释:注释AI和代码一部分是我自己写的)

一、第一周

1 求最大公约数和最小公倍数

题目内容:

  编写程序,在主函数中输入两个正整数 a,b,调用两个函数 fun1() 和 fun2(),分别求 a 和 b 的最大公约数和最小公倍数,在主函数中输出结果。

输入格式:

  两个正整数

输出格式:

  最大公约数和最小公倍数

输入样例:

12,40[回车]

输出样例:

最大公约数:4[回车]

最小公倍数:120[回车]

代码:

#include<stdio.h>

int fun1(int a,int b){
	int min,max;
	if(a<=b){
		min=a;
		max=b;
	}
	else{
		min=b;
		max=a;
	}
	for(int i=min;i>0;i--){
		if((min%i==0)&&(max%i==0)){
			return i;
		}
	}
	
}
int fun2(int a,int b){
	int num;
	return a*b/fun1(a,b);
}

int main(){
	int a,b;
	scanf("%d,%d",&a,&b);
	printf("最大公约数:%d\n",fun1(a,b));
	printf("最小公倍数:%d\n",fun2(a,b));
}

解释:

这段代码包含了两个函数fun1fun2,以及main函数。fun1函数用于计算两个整数的最大公约数(Greatest Common Divisor, GCD),而fun2函数用于计算两个整数的最小公倍数(Least Common Multiple, LCM)。最后,main函数获取用户输入的两个整数,并调用这两个函数来输出它们的最大公约数和最小公倍数。

#include<stdio.h>

int fun1(int a,int b){
    int min,max;
    if(a<=b){
        min=a;
        max=b;
    }
    else{
        min=b;
        max=a;
    }
    for(int i=min;i>0;i--){
        if((min%i==0)&&(max%i==0)){
            return i;
        }
    }
}

fun1函数接收两个整数ab作为参数,并返回它们的最大公约数。首先,函数确定两个数中的最小值和最大值。然后,它从最小值开始向下遍历,直到找到能够同时整除这两个数的最大数,即最大公约数。

int fun2(int a,int b){
    int num;
    return a*b/fun1(a,b);
}

fun2函数接收两个整数ab作为参数,并返回它们的最小公倍数。它通过调用fun1函数来获取ab的最大公约数,然后使用公式a*b/GCD(a,b)来计算最小公倍数,其中GCD(a,b)ab的最大公约数。

int main(){
    int a,b;
    scanf("%d,%d",&a,&b);
    printf("最大公约数:%d\n",fun1(a,b));
    printf("最小公倍数:%d\n",fun2(a,b));
}

main函数是程序的入口点。它首先通过scanf函数读取用户输入的两个整数ab,然后分别调用fun1fun2函数来计算并打印这两个整数的最大公约数和最小公倍数。

需要注意的是,scanf函数中的格式字符串"%d,%d"期望输入时两个整数之间有一个逗号,。如果用户输入时没有逗号,程序将无法正确读取两个整数。此外,fun1函数在找到最大公约数后应该立即返回,而不是继续执行循环。在fun1函数中,找到最大公约数后应该有一个break语句来退出循环,以提高效率。

2 排序并插入

题目内容:

  编写程序,在主函数中定义一个有10个元素的整型一维数组,用户输入9个数据,调用函数,对数组元素进行从小到大排序后,在函数中输入一个数,插入到数组中正确的位置,并输出。

输入格式:

  9个整数和1个整数

输出格式:

  10个整数

输入样例:

2,3,1,5,6,76,89,31,90[回车]

7[回车]

输出样例:

1,2,3,5,6,7,31,76,89,90[回车]

代码:

#include <stdio.h>
void sort(int n[],int m)
{
    int i,j,t;
    for(i=0; i<9; i++)
    {
        for(j=0; j<= 8-i; j++)
        {
            if(n[j] > n[j+1])
            {
                t = n[j];
                n[j] = n[j+1];
                n[j+1] = t;
            }
        }
    }
    for(i=0; i<10; i++)
    {
        printf("%d",n[i]);
        if(i<9) printf(",");
    }
}
int main()
{
    int j,i,n[10];
    for(i=0; i<9; i++)
    {
        scanf("%d", &n[i]);
        if(i<8) scanf(",");
    }
    scanf("%d",&n[9]);
    sort(n,10);
    return 0;
}

解释

这段代码的主要功能是读取10个整数,然后使用插入排序算法对它们进行排序,并按照逗号分隔的格式输出排序后的数字。

#include <stdio.h>

void sort(int n[], int m) {
    int i, j, t;
    for (i = 0; i < 9; i++) {
        for (j = 0; j <= 8 - i; j++) {
            if (n[j] > n[j + 1]) {
                t = n[j];
                n[j] = n[j + 1];
                n[j + 1] = t;
            }
        }
    }
    for (i = 0; i < 10; i++) {
        printf("%d", n[i]);
        if (i < 9) printf(",");
    }
}

sort函数接收一个整数数组n和数组的大小m。它使用插入排序算法对数组进行排序。插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。排序完成后,函数会打印出排序后的数组,每个元素之间用逗号分隔。

int main() {
    int j, i, n[10];
    for (i = 0; i < 9; i++) {
        scanf("%d", &n[i]);
        if (i < 8) scanf(",");
    }
    scanf("%d", &n[9]);
    sort(n, 10);
    return 0;
}

 main函数是程序的入口点。它首先声明一个整型数组n,大小为10。然后,它使用scanf函数读取10个整数,存储在数组n中。在读取前9个数字后,程序还会读取一个逗号。最后,调用sort函数对数组进行排序,并打印排序后的结果。

二、第二周

1 最大公约数

题目内容:

  输入两个整数m,n,用递归算法实现计算两个数的最大公约数。

输入格式:

  输入两个整数m,n

输出格式:

  最大公约数

输入样例:

12,40[回车]

输出样例:

4[回车]

代码

#include<stdio.h>
int  fun1(int a,int b){
    int c;
    while(b!=0){
        c=a%b;
        a=b;
        b=c;
    }
    return a;
    
}
 
int main(){
    int a,b;
    scanf("%d,%d",&a,&b);
    printf("%d\n",fun1(a,b));
    return 0; 
}

 解释

这段代码定义了一个名为fun1的函数,该函数用于计算两个整数的最大公约数(Greatest Common Divisor, GCD),并在main函数中调用fun1来计算用户输入的两个整数的最大公约数。

#include<stdio.h>

int fun1(int a, int b){
    int c;
    while(b != 0){
        c = a % b;
        a = b;
        b = c;
    }
    return a;
}

fun1函数使用辗转相除法(也称欧几里得算法)来计算最大公约数。辗转相除法的基本思想是:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。在函数中,ab的值在每次循环中被更新,直到b变为0,此时a的值就是两个数的最大公约数。

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

 main函数是程序的入口点。它首先声明两个整型变量ab,然后使用scanf函数读取用户输入的两个整数,这两个整数之间需要用逗号分隔。接着,调用fun1函数计算这两个整数的最大公约数,并使用printf函数输出结果。

2 奇数求和

题目内容:

  用递归算法实现,输入整数n(n>0), 求1+3+5+7….+(2*n-1) 的和

输入格式:

  输入整数n

输出格式:

  输出和

输入样例:

5[回车]

输出样例:

25[回车]

代码

#include<stdio.h>

int main(){
	int n,sum=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		sum+=2*i-1 ;
	}
	printf("%d\n",sum);
}

解释

  1. #include<stdio.h>:这行代码包含了标准输入输出库stdio.h,它提供了基本的输入输出功能,如scanfprintf

  2. int main():这是主函数,程序的入口点。

  3. int n, sum=0;:声明了两个整型变量nsum,其中sum初始化为0,用于存储奇数的和。

  4. scanf("%d",&n);:这行代码从用户那里读取一个整数n

  5. for(int i=1; i<=n; i++):这是一个for循环,它从1开始,递增到n。

  6. sum += 2*i - 1;:这是循环体中的唯一语句,它计算当前循环次数i对应的奇数(2i - 1),并将其加到sum上。由于i从1开始,2i - 1总是奇数。

  7. printf("%d\n",sum);:循环结束后,这行代码输出计算得到的奇数和sum

  8. return 0;:表示程序正常退出。

三、第三周

1 巧算自然数

题目内容:

  编程实现输入一个自然数,若为偶数,则把它除以2;若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。输出经过多少次可以得到自然数1和每次得到的值。

输入格式:

  输入一个自然数

输出格式:

  输出经过多少次可以得到自然数1和每次得到的值

输入样例:

22[回车]

输出样例:

22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1[回车]

step=16[回车]

代码:

#include<stdio.h>

void number(int n){
	int step=0;
	printf("%d",n);
	while(n!=1){
		if(n%2==0){
			n=n/2;
		}
		else{
			n=3*n+1;
		}
		step+=1;
		printf(",%d",n);
	
	}printf("\nstep=%d\n",step+1);
}

int main(){
	int n,step;
	scanf("%d",&n);
	number(n);
}

解释: 

这段代码实现了一个称为“Collatz 序列”(也称为“3n+1 猜想”或“奇偶归一猜想”)的数学问题。Collatz 序列的定义是:对于任何一个正整数n,如果n是偶数,则将其除以2;如果n是奇数,则将其变为3n+1。重复这个过程,最终所有数都会变为1。

  1. #include<stdio.h>:这行代码包含了标准输入输出库stdio.h,它提供了基本的输入输出功能,如scanfprintf

  2. void number(int n):这是一个名为number的函数,它接受一个整数n作为参数,并打印出从n开始的Collatz序列。

  3. int step=0;:在number函数中,声明了一个整型变量step,用于记录执行步骤数。

  4. printf("%d",n);:打印出当前的数值n

  5. while(n!=1):这是一个while循环,它会一直执行,直到n变为1。

  6. if(n%2==0):判断n是否为偶数。如果是,则执行n=n/2

  7. else:如果n是奇数,则执行n=3*n+1

  8. step+=1;:每执行一次操作,step就增加1。

  9. printf(",%d",n);:打印出经过一次操作后的新值n

  10. printf("\nstep=%d\n",step+1);:当循环结束时,打印出总共执行的步骤数。注意,这里打印的是step+1,因为初始值n也算一步。

  11. int main():这是主函数,程序的入口点。

  12. int n,step;:声明了两个整型变量nstepstep在这里并没有被使用,可以删除。

  13. scanf("%d",&n);:从用户那里读取一个整数n

  14. number(n);:调用number函数,传入用户输入的整数n

2 卖鸭子

题目内容:

    编程调用递归函数。一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了7个村子后还剩2只鸭子,问他出发时共赶多少只鸭子?经过每个村子时依次卖出多少只鸭子?

输入格式:

输出格式:

出发时总鸭子数

每个村子卖出鸭子数

输入样例:

输出样例:(不是结果,仅表示格式)

sum=25[回车]

sell=8,sell=4,[回车]

代码:

#include<stdio.h>
int circ(int);
 
int main()
{
	
	int all, v, sum;
	all = circ(7);
	printf("sum=%d\n",all);
	for(v = 0; v < 7; v++)
	{
		sum = all / 2 + 1;
		
		printf("sell=%d,", sum);
		
		all = all / 2 - 1;
	}
	printf("\n");
 
 
	return 0;
}
int circ(int i)
{
	if(i == 0)
	{
		return 2;
	}
	else
	{
		i = 2*( circ(i - 1) +1);
		return i;
	}
}

解释:

这段代码定义了一个名为circ的递归函数,用于计算一个特定的数列中的第i项的值。然后在main函数中使用这个函数来计算一个剧场中座位的总数,并模拟座位销售的过程。

#include<stdio.h>
int circ(int);

int main()
{
    int all, v, sum;
    all = circ(7); // 调用circ函数计算第7项的值
    printf("sum=%d\n",all); // 打印总座位数

    for(v = 0; v < 7; v++) // 循环7次,模拟7天的销售过程
    {
        sum = all / 2 + 1; // 计算当天销售的座位数
        printf("sell=%d,", sum); // 打印当天销售的座位数

        all = all / 2 - 1; // 更新剩余的座位数
    }
    printf("\n");

    return 0;
}

int circ(int i)
{
    if(i == 0)
    {
        return 2; // 基本案,第0项的值为2
    }
    else
    {
        i = 2 * (circ(i - 1) + 1); // 递归计算第i项的值
        return i;
    }
}
  1. #include<stdio.h>:这行代码包含了标准输入输出库stdio.h,它提供了基本的输入输出功能,如printf

  2. int circ(int);:这是circ函数的声明,它接受一个整数i作为参数,并返回一个整数。

  3. int main():这是主函数,程序的入口点。

  4. all = circ(7);:调用circ函数计算第7项的值,并将其存储在变量all中。

  5. printf(

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值