C语言--数字交换题目详解

目录
  • 一、题目分析
  • 二、算法分析和设计
    • 心路历程
      • 位置分析
      • 分析交换算法
    • 回顾总结(问题核心)
  • 三、编写代码
  • 四、出现问题
  • 总结

一、题目分析

大致题意就是通过交换把最小的数放到最前面,最大的数放最后面。另外要求编写三个函数。

二、算法分析和设计

心路历程

题目有四个关键词,最大值和最小值,第一个数和最后一个数。这就是我们分析的重点。
接下来先对最大值和最小值分析,如果两个数的值相同,位置相同,说明所有的数据都相同,我们什么都不用做。如果两个数的值不同,位置肯定也不同,所以最大值和最小值的位置关系是分析的重点。

位置分析

1.问:在头、身、尾三种位置中,最大值和最小值的位置有多少种?

解法一: 最大值有3种可能,最小值有3种可能,但头尾只能容纳一个值,有2种不合法,所以共有3*3-2=7种情况。

解法二:最大值在头,最小值有2种可能;最大值在身,最小值有3种可能;最大值在尾,最小值有2种可能。共有2+3+2=7种。

2.列出1中所有情况。

队首 队中 队尾
max min -
max - min
min max -
- max,min -
- max min
min - max
- min max

分析交换算法

以先将最小值归位(最小值和第一个数交换),再将最大值归位(最大值和最后一个数交换)进行分析,注意是按位置操作。

队首 队中 队尾 可行性 不可行的原因
max min - × 第一次把最小值换到了第一位,第二次又把最小值误当做最大值换到了最后一位
max - min × 同上
min max - -
- max,min - -
- max min -
min - max -
- min max -

通过对上面的分析,发现最大值在第一位的时候交换算法不可行,原因是这时的交换算法的第一步破坏了最大值和最小值的位置。对第一种情况,先将最大值归位,再将最小值归位;对第二种情况,执行将最小值归位即可。(这只是一种处理方式,仅作参考)。

回顾总结(问题核心)

题目中要使用到两次交换,第一次交换会不会影响第二次交换是问题的关键,算法只要不让第一次交换影响到第二次交换即可,或者不让第二次交换受到第一次交换的影响。

算法思路分析描述版:

将最小值归位,再将最大值归位。第一次的执行肯定是可以将最小值移到第一位的,所以不用考虑最小值(位置)。而最大值只有在第一位的时候才会受到第一次交换的影响。最大值在第一位有两种情况,需要分别进行特殊处理。

队首 队中 队尾 可行性 不可行的原因
max min - × 第一次把最小值换到了第一位,第二次又把最小值误当做最大值换到了最后一位
max - min × 同上

对第一种情况,先将最大值归位,再将最小值归位;对第二种情况,执行将最小值归位即可。

三、编写代码

#include <stdio.h>
#include <stdlib.h>
#define MAXN 10
int data[MAXN];
void get_data(){
    int i;
    for(i=0;i<MAXN;i++) scanf("%d",data+i);
}
void analysis(){
    int min=data[0],max=data[0];
    int mini=0,maxi=0;
    int temp;
    for(int i=1;i<MAXN;i++){
        if(data[i]<min){
            min=data[i];
            mini=i;
        }
        if(data[i]>max){
            max=data[i];
            maxi=i;
        }
    }
    if(maxi==mini) ; //nothing to do
    else if((maxi==0)&&(min!=MAXN-1)){
        temp=data[MAXN-1];
        data[MAXN-1]=data[maxi];
        data[maxi]=temp;
        temp=data[0];
        data[0]=data[mini];
        data[mini]=temp;
    }
    else if((maxi==0)&&(min==MAXN-1)){
        temp=data[0];
        data[0]=data[mini];
        data[mini]=temp;
    }
    else{
        temp=data[0];
        data[0]=data[mini];
        data[mini]=temp;
        temp=data[MAXN-1];
        data[MAXN-1]=data[maxi];
        data[maxi]=temp;
    }
}
void print_data(){
    for(int i=0;i<MAXN;i++) printf("%d ",data[i]);
}
int main()
{
    get_data();
    analysis();
    print_data();
    return 0;
}

四、出现问题

1.把max的位置maxi打错,打成了max,少打了一个i。

2.把宏定义MAXN当做数组的最后一个元素,实际应该是MAXN-1,MAXN是数组的大小。

3.把mini==maxi写成mini=maxi,等于操作符写成赋值操作符。

4.最大值在首,最小值在尾的情况解决方法出现错误,原来使用把最大值先归位、再把最小值归位的错误算法,实际上是两次互相交换,不起作用。但是提交到系统通过了,说明系统没有这种形式的测试用例。不过还是不能侥幸。

总结

本片文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C语言中交换int型变量的值及转换为字符数组的方法

    不使用其他变量交换两个整型的值: #include <stdio.h> void main(){ int a = 3; int b = 4; a = a ^ b;//使用异或交换 b = b ^ a; a = a ^ b; printf("%d, %d\n", a, b); a = a - b;//使用加减交换 b = a + b; a = b - a; printf("%d, %d\n", a, b); a ^= b ^= a ^= b; printf

  • C语言如何利用异或进行两个值的交换详解

    C语言异或运算 位运算符家族中,最常用的,某过于异或运算符. 异或运算符是指: 参与运算的两个值,如果两个相应位相同,则结果为0,否则为1.即:0^0=0, 1^0=1, 0^1=1, 1^1=0 例如:10100001^00010001=10110000 0^0=0,0^1=1 可理解为:0异或任何数,其结果=任何数 1^0=1,1^1=0 可理解为: 1异或任何数,其结果=任何数取反 任何数异或自己,等于把自己置0 1)按位异或可以用来使某些特定的位翻转,如对数10100001的第1位和第2

  • c语言实现两个值互相交换的函数

    c语言中实现两个值互换的函数. 1. #include <stdio.h> void swap(int n1, int n2) { int tmp; tmp = n1; n1 = n2; n2 = tmp; } int main(void) { int a, b; puts("please input two integers."); printf("a = "); scanf("%d", &a); printf("

  • C语言:传值与传址交换整数

    目录 传值调用 传址调用 总结 传值调用 要想交换两个整数的值,我们可以自定义一个函数,来实现这个过程.具体代码如下: #include <stdio.h> void Swap1(int x, int y) { int z = 0; z = x; x = y; y = z; } int main() { int a = 10; int b = 20; pirntf("交换前:a=%d b=%d", a, b); Swap1(a, b); pirntf("交换前:a

  • 用C语言的泛型实现交换两个变量值

    第一种,最常用的是创建一个中间变量来循环交换它们的值: T a = ...; T b = ...; . T tmp = a; a = b; a = tmp; 我们称这种策略p99_swap1.在这里,编译器必须严格实现三个任务的顺序,否则,由此程序产生的结果将是不正确的. 第二种,叫它p99_swap2,试图做类似的事情,但放松一些顺序约束: T a = ...; T b = ...; . T tmpa = a; T tmpb = b; a = tmpb; b = tmpa; 用更多的资源(栈空

  • C语言--数字交换题目详解

    目录 一.题目分析 二.算法分析和设计 心路历程 位置分析 分析交换算法 回顾总结(问题核心) 三.编写代码 四.出现问题 总结 一.题目分析 大致题意就是通过交换把最小的数放到最前面,最大的数放最后面.另外要求编写三个函数. 二.算法分析和设计 心路历程 题目有四个关键词,最大值和最小值,第一个数和最后一个数.这就是我们分析的重点. 接下来先对最大值和最小值分析,如果两个数的值相同,位置相同,说明所有的数据都相同,我们什么都不用做.如果两个数的值不同,位置肯定也不同,所以最大值和最小值的位置关

  • 易语言子程序知识点详解

    将程序分割成较小的逻辑组件就可以简化程序设计任务,这些逻辑组件被称为子程序. 子程序可用于压缩重复任务或共享任务,例如,压缩频繁的计算处理等等. 用子程序编程有两大好处: 子程序可使程序划分成离散的逻辑组件,每个组件都比无子程序的整个程序容易调试及理解: 一个应用程序中的子程序,往往不必修改或只需稍作改动,便可以成为另一个程序的子程序. 每次调用子程序时,子程序中的所有语句都将被从第一条开始顺序执行,当执行到子程序尾部或者遇到"返回"命令时即返回到调用此子程序语句的下一条语句处. 子程

  • Spring表达式语言SpEL用法详解

    这篇文章主要介绍了spring表达式语言SpEL用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 (1)spring表达式语言是一个支持运行时查询和操作对象图得我强大表达式语言. (2)语言类似于EL:SpEL使用#{...}作为定界符.所有在大括号中的字符串均被认为是SpEL. (3)SpEL为bean的属性进行动态赋值提供了便利. (4)通过SpEL可以实现: 通过Bean的id对Bean进行引用 调用方法及引用对象的属性 计算表达式

  • R语言数据类型深入详解

    R语言用来存储数据的对象包括: 向量, 因子, 数组, 矩阵, 数据框, 时间序列(ts)以及列表 意义介绍 1. 向量(一维数据): 只能存放同一类型的数据 语法: c(data1, data2, ...),访问的时候下标从1开始(和Matlab相同);向量里面只能存放相同类型的数据. > x <- c(1,5,8,9,1,2,5) > x [1] 1 5 8 9 1 2 5 > y <- c(1,"zhao") # 这里面有integer和字符串, 整

  • R语言关联规则深入详解

    在用R语言做关联规则分析之前,我们先了解下关联规则的相关定义和解释. 关联规则的用途是从数据背后发现事物之间可能存在的关联或者联系,是无监督的机器学习方法,用于知识发现,而非预测. 关联规则挖掘过程主要包含两个阶段:第一阶段从资料集合中找出所有的高频项目组,第二阶段再由这些高频项目组中产生关联规则. 接下来,我们了解下关联规则的两个主要参数:支持度和置信度. 用简化的方式来理解这两个指标,支持度是两个关联物品同时出现的概率,而置信度是当一物品出现,则另一个物品也出现的概率. 假如有一条规则:牛肉

  • R语言“循环”知识点详解

    可能有一种情况,当你需要执行一段代码几次. 通常,顺序执行语句. 首先执行函数中的第一个语句,然后执行第二个语句,依此类推. 编程语言提供允许更复杂的执行路径的各种控制结构. 循环语句允许我们多次执行一个语句或一组语句,以下是大多数编程语言中循环语句的一般形式 - R编程语言提供以下种类的循环来处理循环需求. 单击以下链接以检查其详细信息. Sr.No. 循环类型和描述 1 repeat循环 多次执行一系列语句,并简化管理循环变量的代码. 2 while循环 在给定条件为真时,重复语句或语句组.

  • C语言字符串数组详解

    C语言字符串数组 字符串是连续的字符序列,最后以空字符'\0'作为终止符.一个字符串的长度指所有字符的数量,但不包括终止符.在 C 语言中,没有字符串类型,自然也就没有运算符以字符串为操作数. 字符串被存储在元素类型为 char 或宽字符类型数组中(宽字符类型指 wchar_t.char16_t 或 char32_t).宽字符组成的字符串也称为宽字符串(wide string). C 标准库提供了大量的函数,它们可以对字符串进行基本操作,例如字符串的比较.复制和连接等.在这些传统的字符串函数以外

  • C语言lseek()函数详解

     头文件: #include <sys/types.h> #include <unistd.h> 函数原型: off_t lseek(int fd, off_t offset, int whence);//打开一个文件的下一次读写的开始位置 参数: fd 表示要操作的文件描述符 offset是相对于whence(基准)的偏移量 whence 可以是SEEK_SET(文件指针开始),SEEK_CUR(文件指针当前位置) ,SEEK_END为文件指针尾 返回值: 文件读写指针距文件开头

  • 关于C语言qsort函数详解

    目录 C语言qsort函数详解 一.qsort函数是什么 二.使用qsort排序-以升序为例 1.整形数组排序 2.字符数组排序 3.字符指针数组排序 4.结构体数组排序 5.浮点型数组排序 三.使用冒泡排序思想模拟实现qsort函数 1.什么是冒泡排序 2.冒泡排序代码 3. 使用冒泡排序思想模拟实现qsort函数 C语言qsort函数详解 一.qsort函数是什么 我们可以使用  搜索库函数网址或者MSDN软件进行查找. qsort()函数:快速排序的函数  -引用stdlib.h头文件 参

  • Go语言--切片(Slice)详解

    目录 一.定义切片 1.声明一个未指定大小的数组来定义切片 2.使用make()函数来创建切片 二.切片是可索引的 1.len() 和 cap() 函数 三.切片截取 四.增加切片的容量 说明: Go 语言切片是对数组的抽象. Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大. 一.定义切片 注意:切片不需要说明长度 1.声明一个未指定大小

随机推荐