前言
记录本周编程组作业的解题思路和题解,以及做题的总结。
题目
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.附加题
首先输入一个数组的大小,如何输入数组的数据,接下来对数组排序后输出。提示:冒泡排序与选择排序。
排序的方法https://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;
}
总结
对于同一道题,有不同的多种解法,我们可以从不同的角度去思考,不断比较和优化解决方法。