c语言编程题

文章目录


前言

记录本周编程组作业的解题思路和题解,以及做题的总结。

题目

1.比较大小

输入三个数a,b,c,比较输出其中的最大值

方法一:

解题思路:运用条件运算符(c语言中唯一一个三元运算符)和条件表达式。

条件表达式的一般形式:表达式1 ? 表达式2 :表达式3   含义:若表达式1的值非0(即成立),则该条件表达式的值是表达式2的值,否则是表达式3的值。

代码实现:

#include<stdio.h>
int main(){
	int  a,b,c,t,max;
	scanf("%d %d %d",&a,&b,&c);
	t=a>b?a:b;//用条件表达式计算a和b两整数的最大值 
	max=t>c?t:c;//用条件表达式计算t和c两整数的最大值
	printf("%d",max);
	return 0;
}

方法二:

解题思路:将a首先赋值给最大值,再将最大值分别与b,c进行比较。

代码实现:

#include<stdio.h>
int main(){
	int  a,b,c,max;
	scanf("%d %d %d",&a,&b,&c);
	max=a;
	if(b>max){
		max=b;
	}
	if(c>max){
		max=c;
	}
	printf("%d",max);
	return 0;
}

2.数的倒置

输入一个数(12345678),输出这个数的倒置(87654321).

方法一:

解题思路:将最后一位通过循环不断乘10至最高位。

代码实现:

#include<stdio.h>
int main(){
	int x,t,result=0;
	scanf("%d",&x);
	while(x>0){
		t=x%10;
		//将x的最后一位赋值给t
		result=result*10+t;
		//对result每次乘10,每次让t往前一位前进 
		x/=10;
		//让取完最后一位的数字除10进入下一次循环 
	}
	printf("%d",result);
	return 0;
}

方法二:

解题思路:运用do-while直到型循环的特点,先执行循环体后计算并判定循环控制条件为真还是为假,循环打印出最后一位。

代码实现:

#include<stdio.h>
int main(){
	int  x;
	scanf("%d",&x);
	do{
		int d=x%10;
		printf("%d",d);
		x/=10;
	}while(x>0);
	return 0;
}

3.最大公约数

写一个函数,完成输入两个整数,输出最大公约数的功能。

方法一:

解题思路:根据最大公约数的定义,两个数都能被它整除的最大的那个数。从1开始试,到两个数中最小的那个数然后退出循环。

代码实现:

#include<stdio.h>
int main(){
	int  a,b,min,t,ans;
	scanf("%d %d",&a,&b);
	min=a<b?a:b;//将a和b中最小的数赋值给min
	if(min==a){
		t=b;
	}else{
		t=a;
	}//将最大值赋值给t 
	for(int i=1;i<=min;i++){
		if(min%i==0&&t%i==0){
			ans=i;//表示min和t可以被i整除 
		}
	} 
	printf("%d",ans);
	return 0;
}

方法二:

解题思路:辗转相除法:

假设有A和B两个值,A大于B,用其中较大的数A除以较小的数B,再将较小的数B除以得到的余数C(第一次除法所得),又得到一个余数D(第二次除法所得),如此类推,直到最后余数为0时终止该过程,取当时除数A和B的最大公约数。

例如:A=28 B=21

28÷21=1...7

21÷7=3...0即7是28和21 的最大公约数。

代码实现:

#include<stdio.h>
int main(){
	int  a,b,c,ys;
	scanf("%d %d",&a,&b);
	if(a<b){
		c=a;
		a=b;
		b=c;
	}//通过中间变量让a成为最大值
	while(b!=0){
		ys=a%b;
		a=b;
		b=ys;
	} 
	printf("%d",a);//最后的除数的值给了a 
	return 0;
}

4.附加题

首先输入一个数组的大小,如何输入数组的数据,接下来对数组排序后输出。提示:冒泡排序与选择排序。

排序的方法icon-default.png?t=N2N8https://blog.csdn.net/weixin_50886514/article/details/119045154?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168142916516800182713199%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168142916516800182713199&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-119045154-null-null.142^v83^insert_down38,239^v2^insert_chatgpt&utm_term=%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F&spm=1018.2226.3001.4187

连接中有动图解释说明。

方法一:冒泡排序

解题思路:比较相邻的元素,如果左边的元素大于右边的就交换二者,每次均从第一对相邻的元素开始比较直到最后一对,最后的元素为最大的值。重复以上步骤,次数为开始便利数组的第一个for循环。

代码如下:

#include<stdio.h>
int main(){
	int  n;
	scanf("%d\n",&n);
	int a[n];//定义一个整数数组且大小为n 
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);//循环输入数组中的每一位 
	}
	//开始便利数组
	for(int i=0;i<n;i++){
		//第一个for循环决定要进行几次比较 
		for(int j=0;j<n-1;j++){
			//第二个for循环将相邻的两个数不断比较 
		if(a[j]>a[j+1]){
			int t=a[j+1];
			a[j+1]=a[j];
			a[j]=t;//利用中间变量交换这一对值 
		}}
	} 
	for(int i=0;i<n;i++){
		printf("%d",a[i]);
	}
	return 0;
}

方法二:选择排序

解题思路:先选出最小的数换到第一个位置,再在剩下的数找最小的换到第二个,直到排序结束。

代码如下:

#include<stdio.h>
int main(){
	int  n,min,t;
	scanf("%d\n",&n);
	int a[n];//定义一个整数数组且大小为n 
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);//循环输入数组中的每一位 
	}
	//开始便利数组
	for(int i=0;i<n-1;i++){
		for(int j=i+1;j<n;j++){
			if(a[j]<a[i]){
				int t=a[i];
				a[i]=a[j];
				a[j]=t;
			}
			//抓住的是一个位置不变,不断拿i后的数进行比较 
		}
	
	}
	for(int i=0;i<n;i++){
		printf("%d",a[i]);	}
	return 0;
}

总结

对于同一道题,有不同的多种解法,我们可以从不同的角度去思考,不断比较和优化解决方法。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值