关于C语言一维数组算法问题详解

目录
  • 问题1:将数组中的数逆序存放
  • 问题2:求数组中最大值及其下标
  • 问题3:找出不是两个数组的共有元素
  • 问题4:找出出现次数最多的数
  • 问题5:数组中插入数字并排序
  • 问题6:数组循环右移问题
  • 总结

问题1:将数组中的数逆序存放

本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放, 再按顺序输出数组中的元素。

算法描述:1.向数组a中输入元素;

2.定义一个新数组new,将数组a中的元素倒序存放;

3.将数组b正序输出,注意结尾无空格的格式问题。

代码实现 :

#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int i,arr[n];
    for(i = 0;i < n;i++)
    {
        scanf("%d",&arr[i]);
    }

    int new[n],j;					//定义一个数组new用来存入数组a的逆顺序
    for(int j = 0;j < n;j++)
    {
        new[j] = arr[n-1-i];		//倒序存入
    }
    for(int k = 0;k < n - 1;k++)	//数组中最后一个元素不一起输入,保持结尾无空格
    {
        printf("%d ",new[k]);
    }
    	printf("%d",new[n-1]);		//输出最后一个元素
    return 0;
}

运行结果:


问题2:求数组中最大值及其下标

本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。 输入格式: 输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。 输出格式: 在一行中输出最大值及最大值的最小下标,中间用一个空格分开。

算法描述:1.向数组中存放元素;

2.把数组中第一个元素先定义一个变量保存住;

3.遍历数组,如果比保存第一个元素的变量大,那就赋值给那个变量,直到变量值变为最大;

4.定义一个变量用来记录最大值的下标。

代码实现:

#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int arr[n],i;
    for(i = 0;i < n;i++)
    {
        scanf("%d",&arr[i]);
    }

    int max = arr[0];               //定义一个变量保存数组第一个元素
    for(int j = 1;j < n;j++)
    {
        if(max < arr[j])            //如果小于就一直给m,直到找到最大值停
        {
            max = arr[j];
        }
     }
    for(int num = 0;num < n;num++)  //记录最大值下标操作
    {
        if(arr[num] == max)
        {
            printf("最大值为:%d\n其下标为:%d",max,num);
            break;
        }
    }
    return 0;
}

运行结果:

问题3:找出不是两个数组的共有元素

本题要求给定两个整型数组,本题要求找出不是两者共有的元素。

算法描述:1.分别定义两数组并输入值;

2.用数组a中元素对比数组b中元素,非共有值放入c中(此处可以用一个 标志变量flag,标志 是否有共有值);

3.用数组b中元素对比数组a中元素,重复“2”操作;

4.最后先输出数组c中第一个元素,然后判断元素是否与之前录入元素

重复。

5.最后打印出来数组c中的元素,也就是非共有值,此处注意格式问题。

代码实现:

#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int arr1[n],i;                      //定义第一个数组
    for(i = 0;i < n;i++)
    {
        scanf("%d",&arr1[i]);
    }

    int m;
    scanf("%d",&m);
    int arr2[m],j;                      //定义第二个数组
    for(j = 0;j < m;j++)
    {
        scanf("%d",&arr2[j]);
    }

    int k,rem[20] = {};                 //数组rem是用来记录非公有值的
    for(i = 0;i < n;i++)
    {
        int flag = 0;                   //定义标志变量用来标志是否有非共有值
        for(j = 0;j < m;j++)
        {
            if(arr1[i] == arr2[j])  //用数组1中元素对比数组2中元素,非共有值放入数组rem中
            {
                flag = 1;
            }
        }
        if(flag == 0)
        {
            rem[k] = arr1[i];
            k++;
        }
    }

    for(i = 0;i < m;i++)        //用数组2中元素对比数组1中元素,非共有值放入数组rem中
    {
        int flag = 0;
        for(j = 0;j < n;j++)
        {
            if(arr2[i] == arr1[j])
            {
                flag = 1;
            }
        }
        if(flag == 0)
        {
            rem[k] = arr2[i];
            k++;
        }
    }

    printf("非共有元素:%d",rem[0]);      //输出rem中第一个元素
    for(i = 1;i < k;i++)
    {
        for(j = 0;j < i;j++)
        {
            if(rem[i] == rem[j])
            {
                break;
            }
        }
        if(j >= i)
        {
            printf(" %d",rem[i]);   //因为提前输出第一个元素,所以后面要打一个空格再打元素,
                                    //结尾无空格的格式问题
        }
    }
    return 0;
}

运行结果:

问题4:找出出现次数最多的数

本题要求统计一个整型序列中出现次数最多的整数及其出现次数。

输入格式: 输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数。数字间以空格分隔。

输出格式: 在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的

算法描述:1.定义两个数组,一个用来存放元素,另一个用来当计数器,此数组注意需 要初始化;

2.在这个数组中找到重复的,然后把计数器数组赋值+1;

3.一直遍历找到重复最多的,找到后把计数器数组元素赋值给变量max(也 就是出现次 数),计数器数组下标就是出现次数最多数的下标。

代码实现:

#include <stdio.h>
int main()
{
    int n,arr[1000],cnt[1000] = {0};        //cnt为计数器数组,需要初始化
    int i,j,k,max = 0;
    scanf("%d",&n);
    for(i = 0;i < n;i++)
    {
        scanf("%d",&arr[i]);
    }

    for(i = 0;i < n;i++)
    {
        for(j = 0;j < n;j++)
        {
            if(arr[i] == arr[j])        //找到一样的
            {
                cnt[i] = cnt[i] + 1;    //cnt[i]++
            }
        }
    }

    for(i = 0;i < n;i++)
    {
        if(max < cnt[i])            //一直遍历直到找重复最多的
        {
            max = cnt[i];           //找到后赋值给max
            k = i;              //i就是重复最多的数的下标
        }
    }

    printf("出现次数最多的数字为:%d\n其出现次数为:%d",arr[k],max);  

    return 0;
}

运行结果:

问题5:数组中插入数字并排序

本题要求给出n个元素的数组,从小到大排列,再输入一个num,插入到数组中, 使得新数组依旧是从小到大的顺序(用一个数组完成)。

算法描述:1.定义一个数组并存放元素,单独记录好倒数第二个元素;

2.输入要插入的数字,注意可以考虑特殊情况,如果插入的数大于原本倒数 第二个数,就可以 直接插入赋值为最后一个元素;

3.再来考虑一般情况,遍历数组,如果原本的数大于要插入的数,先保存住 原来的数字,然 后把插入的数放入到原来的数的位置;

4.插入之后,原本的数就到了后一位,需要把后一位的位置保存住,把原本 的数放到后一 位,再把位置赋上原本数的值;

5.最后遍历输出数组元素 。

代码实现 :

#include <stdio.h>
int main()
{
    int n,i,j;
    scanf("%d",&n);
    int arr[n],t1,t2,num,end;
    for(i = 0;i < n;i++)
    {
        scanf("%d",&arr[i]);
    }
    scanf("%d",&num);           //输入要插入的数字
    end = arr[n-1];             //保存倒数第二个元素

    if(num > end)               //考虑特殊情况,如果插入的数大于倒数第二个
    {
        arr[n] = num;           //直接插入赋值
    }
    else
    {
        for(i = 0;i < n;i++)
        {
            if(arr[i] > num)    //如果原本的数大于插入的数
            {
                t1 = arr[i];    //先保存原来的数
                arr[i] = num;   //把插入的数放到原来数的位置
                for(j = i + 1;j <= n;j++)       //处理原来的数
                {
                    t2 = arr[j];            //原来的数到了后一位保存住
                    arr[j] = t1;            //把原来的数赋值给现在要存的这个位置上
                    t1 = t2;
                }
                break;
            }
        }
    }
    for(i = 0;i <= n;i++)               //注意这里i<=n,因为多插入了一个数字
    {
        printf("%d ",arr[i]);
    }
    return 0;
}

运行结果:

问题6:数组循环右移问题

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯*AN−1)变换为(ANMAN−1A0A1⋯ANM−1)(最后M个数循环移至最前面的M*个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:

在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格

输入样例:

6 2 1 2 3 4 5 6

结尾无空行

输出样例:

5 6 1 2 3 4

结尾无空行

算法描述:1.定义数组并存入元素,输入要移动的值;

2.注意先处理一下移动的值,让他和数组中元素的总个数取个余;

3.优先考虑特殊情况:如果移动的值为0,那直接打印;

4.移动k个,先把最后k个值放到前面,做特殊处理,方便剩余的元素打印;

5.然后再注意格式问题,打印出除最后一个以外的数字+空格,最后在打印 最后一个数。

代码实现:

#include <stdio.h>
int main()
{
    int n,move;
    scanf("%d %d",&n,&move);
    int arr[n],i;
    for(i = 0;i < n;i++)
    {
        scanf("%d",&arr[i]);
    }

    move %= n;              //取余算出到底移动多少,进行简化

    if(move == 0)               //特殊情况特殊处理
    {
        for(i = 0;i < n - 1;i++)
        {
            printf("%d",arr[i]);        //注意格式问题
        }
        printf("%d",arr[n-1]);

        return 0;
    }

    for(i = n - move;i < n;i++)     //移动move,把最后move个数放前面
    {
        printf("%d ",arr[i]);
    }
    for(i = 0;i < n - move - 1;i++) //把剩下除了最后一个数,打印出来
    {
        printf("%d ",arr[i]);
    }
    printf("%d",arr[n-1-move]);         //最后一个没空格

    return 0;
}

运行结果:

总结

到此这篇关于关于C语言一维数组算法问题的文章就介绍到这了,更多相关C语言一维数组算法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言 指针与二维数组详解

    二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解,a 的分布像一个矩阵: 0   1   2   3 4   5   6   7 8   9  10  11 但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存: C语言中的二维数组是按行排列的,也就是先存放 a[

  • C语言二维数组的处理实例

    复制代码 代码如下: char finalPathSet[256][256]; char middlePathSet[256][256]; int finalSetSize=0; int middleSetSize=0; int addToPathSet(char path[]){    strcpy(middlePathSet[middleSetSize],path);    middleSetSize++;}int meetPathSet(){    char tempPathSet[256

  • C语言二维数组中的查找的实例

    C语言二维数组中的查找的实例 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 思路描述:一个数字的下方和右方是比它本身大的区域,而左方和上方时比它本身小的区域.选取右上角的数字进行比较,当该数大于指定的数时,舍去该列,当该数小于指定的数时,舍去该行,当相等时,则表示找到 C语言实现: #include<stdio.h> #include<stdlib.h>

  • C语言一维数组初步学习笔记

    数组 可以存储一组或者多组数值的变量,里面包含多个元素,数组的每个成员都是一个数组元素. 一维数组 定义:类型 数组名[常量表达式] = {值1, 值2, 值3-}; int a[3] = {0, 1, 2}; float f[2] = {1.2, 2.3, 3.14}; char str[] = {'h', 'e', 'l', 'l', 'o'}; chat str1 = "iPhone";//这也是定义字符数组的方法,字符数组后面会详细讲解,这里先了解一下 当数组元素个数为变量时,

  • 关于C语言一维数组算法问题详解

    目录 问题1:将数组中的数逆序存放 问题2:求数组中最大值及其下标 问题3:找出不是两个数组的共有元素 问题4:找出出现次数最多的数 问题5:数组中插入数字并排序 问题6:数组循环右移问题 总结 问题1:将数组中的数逆序存放 本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放, 再按顺序输出数组中的元素. 算法描述:1.向数组a中输入元素: 2.定义一个新数组new,将数组a中的元素倒序存放: 3.将数组b正序输出,注意结尾无空格的格式问题. 代码实现 : #include

  • C语言 array数组的用法详解

    目录 一维数组的创建与初始化 程序一: 程序二: 程序三 程序四(二维数组 - 二维数组 的 列 绝对不能 省略 ) 二维数组在内存中的存储 程序一 数组作为函数参数,怎么作? 实例:冒泡排序 数组名: 一维数组的创建与初始化 数组是一种相同类型元素的集合 程序一: #include<stdio.h> #include<string.h> int main() { 创建一个数组 int arr1[10];// [常量] 初始化 int arr[10]={1,2,3};不完全初始化,

  • C语言实现BF算法案例详解

    BF算法:        BF算法即暴风算法,是普通的模式匹配算法.BF算法的思想:将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果.BF算法是一种蛮力算法. 图示: #include <stdio.h> #include <string.h> int BF(const char *s, const char* sub, int pos)//

  • C语言 柔性数组的使用详解

    目录 一.柔性数组的特点 二.柔性数组的使用 1.如何使用柔性数组 2.不用柔性数组的话有什么代替 三.柔性数组的优势 1.方便内存释放 2.提高访问速度 一.柔性数组的特点 struct S { int x; int a[]; }; int main() { printf("%d", sizeof(S)); } 这段代码的输出是什么? 我们打印结构体S所占空间的大小,这个a[]占多少字节呢? 输出结果是4,可一个int类型的x就是4了,a[]去哪了?好奇怪哦. 原来,这是一种柔性数组

  • C语言中数组的使用详解

    目录 1 数组的基本概念 2 数组定义语法 3 一维数组的初始化 3.1 全部初始化 3.2 部分元素赋初值 3.3 省略长度赋初值 4 一维数组的使用示例 4.1 求最大值.最小值.平均值 4.2 数组逆置 4.3 数组排序 4.3.1 冒泡排序 4.3.2 选择排序 选择列表中的最小值与未排序列表中的第一个值互换位置. 4.3.3 直接插入排序 5 二维数组 5.1 二维数组的概念 5.2 二维数组的初始化 5.2.1 全部初始化 按行全部赋初值 5.2.2 部分初始化 5.2.3 省略长度

  • 易语言一维数组用法详解

    在易语言中,一维数组的用法灵活性较强,所以实际应用起来也能够解决很多问题.我们本次来说明下易语言一维数组的成员操作方法及技巧. 1.首先,我们打开易语言编程工具,新建一个文件,如图所示 2.接着,我们选择要新建的类型,选择windows窗口程序,点击确认.如图所示 3.我们进入窗口界面中,从组件库中选择编辑框.按钮.树型框等放入窗口中,如图所示 4.我们选中树型框,在左侧属性事件中,选择列表项被选择事件,如图所示.在该事件中,我们只需要获取到被选中项的序号即可,如图所示 5.点击进入程序,我们在

  • C语言冒泡排序算法代码详解

    今天我们来用C语言实现一下冒泡排序 首先我们来了解一下什么叫做冒泡排序,冒泡顾名思义把质量轻的气体(如二氧化碳一样)浮到水面上(如可乐中的二氧化碳),因此冒泡排序的原理就是N个元素在一个周期中,微观上依次进行两两元素的比较,小的元素就被放在前面,大的元素放在后面,以此来进行N-1个周期,来完成冒泡排序. 上文中的一个周期,即外循环,依次进行比较,即内循环. 文字看着很迷糊?没事儿,上图 如图所示,两两元素依次进行比较,小的元素往前移动,大的元素往后移动,直至元素顺序是升序的形式,即移动了 元素-

  • Go语言学习之数组的用法详解

    目录 引言 一.数组的定义 1. 语法 2. 示例 二.数组的初始化 1. 未初始化的数组 2. 使用初始化列表 3. 省略数组长度 4. 指定索引值的方式来初始化 5. 访问数组元素 6. 根据数组长度遍历数组 三. 访问数组元素 1. 访问数组元素 2. 根据数组长度遍历数组 四.冒泡排序 五.多维数组 1. 二维数组 2. 初始化二维数组 3. 访问二维数组 六.向函数传递数组 1. 形参设定数组大小 2. 形参未设定数组大小 3. 示例 总结 引言 数组是相同数据类型的一组数据的集合,数

  • C语言 栈与数组的实现详解

    目录 栈的实现 栈的定义 数组实现 静态栈 动态栈 链栈 栈的实现 首先我们思考一个问题,什么是栈? 栈是数据结构的一种,栈在我们日常编码中遇到的非常多,很多人对栈的接触可能仅仅局限在 递归使用的是栈 和 StackOverflowException,栈是一种后进先出的数据结构(可以想象生化金字塔的牢房和生化角斗场的狗洞). 栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进

  • C语言sizeof和strlen的指针和数组面试题详解

    目录 一.概念 sizeof: strlen: 二.例题及解析 2.1 一维数组 2.2 字符数组 2.3 二维数组 三.总结 一.概念 sizeof: sizeof操作符的结果类型为size_t,(它在头文件用typedfe定义为unsigned int类型),计算的是分配空间的实际字节数.sizeof是运算符,可以以类型.函数.做参数 . strlen: strlen结果类型也为size_t(size_t strlen( const char *string )),但strlen是计算的空间

随机推荐