C语言程序设计之 数组2020-10-28 整理:

第一题:求最小数与第一个数交换

【问题描述】

​ 输入一个正整数n (1<n<=100),再输入n个整数,将最小值与第一个数交换,然后输出交换后的n 个数。

【输入形式】

​ 第一行,一个正整数n

​ 第二行,n个由空格隔开的整数

【输出形式】

​ 最小数与第一个数交换后的n的整数

【样例输入】

5

8 2 5 1 4

【样例输出】

1 2 5 8 4

#include <stdio.h>
#include <stdlib.h> int main()
{
int n,i,j,k;
int x[100];
scanf("%d",&n);
//数组元素
for(i=0;i<n;i++){
scanf("%d",&x[i]);
}
//printf("%d",t);
k = 0;
for(j=1;j<n;j++){
if(x[k]>x[j]){
k=j;
}
}
//交换
int t = x[0];
x[0] = x[k];
x[k] = t; for(k=0;k<n;k++){
printf("%d ",x[k]);
} return 0;
}

解释

数组循环存储不解释,很好理解;

首先我们假设最小值的下标为0,即:k=0;

我们所需要做的就是把后面的数与最小值进行比较,如果还有比最小值小的值,则交换下标;

k = 0;
for(j=1;j<n;j++){
if(x[k]>x[j]){
k=j;
}
}

找到最小值的下标,也就找到了最小值的值,然后进行最小值与第一个数进行交换;

//交换
int t = x[0];
x[0] = x[k];
x[k] = t;

两个元素的交换需要通过中间变量(t)来存储,要不然会有数据被覆盖掉,得不到正确的值;

最好循环遍历整个数组即可。

第二题:求一组数的编号

【问题描述】

对数组A中的N(0<N<100)个互不相同的整数从小到大进行连续编号,要求不能改变数组A中元素的顺序。

如A=(78,42,-34,94,25)则输出为(4,3,1,5,2)。个数N和数组中元素要求从键盘输入。

【输入形式】

第一行,一个整数N

第二行n个空格隔开的整数

【输出形式】

按顺序输出每个整数的编号,编号间用逗号分隔

【样例输入】

5

78 42 -34 94 25

【样例输出】

4,3,1,5,2

#include <stdio.h>

int main() {
int x[100];
int a[100];
int n;
int num;
int count=0;
scanf("%d",&n);
//输入数据存入数组中
for (int i = 0; i < n; ++i) {
scanf("%d",&x[i]);
//初始化
a[i]=1;
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (x[i]>=x[j]){
num ++;
}
}
a[i] =num;
num =0;
}
for (int i = 0; i < n; ++i) {
count++;
if(count==n){
printf("%d",a[i]);
} else{
printf("%d,",a[i]);
}
}
return 0;
}

解释:

判断元素的编号,实际是比大小;

定义两个数组,一个存储输入的元素,一个存储记录比较的次数;

对两个数组进行初始化;

两层循环,将第一个元素与每个元素进行比较,如果符合条件的进行记录num++;

每次结束后在第一层循环里记录num的值,并保存到a[]数组中;

将num清零,重复上述操作;

for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (x[i]>=x[j]){
num ++;
}
}
a[i] =num;
num =0;
}

为了满足输出的操作,需要输出a[]数组时判断最后的值,

for (int i = 0; i < n; ++i) {
count++;
if(count==n){
printf("%d",a[i]);
} else{
printf("%d,",a[i]);
}
}

第三题:跳一跳

【问题描述】跳一跳规则如下:玩家每次从当前方块跳到下一个方块,如果没有跳到下一个方块上则游戏结束。 如果跳到了方块上,但没有跳到方块的中心则获得1分;跳到方块中心时,若上一次的得分为1分或这是本局游戏的第一次跳跃则此次得分为2分,否则此次得分比上一次得分多两分(即连续跳到方块中心时,总得分将+2,+4,+6,+8...)。

现在给出一个人跳一跳的全过程,请你求出他本局游戏的得分(按照题目描述的规则)。

【输入格式】

输入包含多个数字,用空格分隔,每个数字都是1,2,0之一,1表示此次跳跃跳到了方块上但是没有跳到中心,2表示此次跳跃跳到了方块上并且跳到了方块中心,0表示此次跳跃没有跳到方块上(此时游戏结束)。

【输入形式】对于所有评测用例,输入的数字不超过30个,保证0正好出现一次且为最后一个数字。

【输出形式】一个整数,表示得分。

【样例输入】1 1 2 2 2 1 1 2 2 0

【样例输出】22

【样例说明】22=1+1+2+4+6+ 1+1+2+4

#include <stdio.h>

int main() {
int n;
//统计得分,记录得分个数
int sum=0,temp=0;
//题目知不超过30
for (int i = 0; i<30; i++) {
scanf("%d",&n);
if(n==0){
break;
}
if (n==1){
//计数清零
temp=0;
sum +=1;
}
if(n==2){
temp +=1;
sum +=temp*2;
}
}
printf("%d",sum);
return 0;
}

解释:

判断个数问题;

如果:

  • =0:退出循环
  • =1:统计得分,得分个数初始化为0,为后面=2做准备
  • =2:统计得分个数,累加2与得分个数的乘积

第四题:开灯问题

【问题描述】有n盏灯,编号为1-n。第一个人把所有灯打开,第2个人按下所有编号为2倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?

输入 n和k,输出开着灯的编号。

【输入形式】两个整数用空格隔开

【输出形式】输出开着灯的编号,编号间用空隔隔开

【样例输入】

7 3

【样例输出】

1 5 6 7

【样例说明】K<=n<=1000

#include <stdio.h>
#include "math.h" int main() {
//n个灯,m个人
int n,m;
int x[10000]={0};
int a=1;
scanf("%d %d",&n,&m);
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (j%i==0){
//取反操作
x[j] = !x[j];
}
}
}
for (int i = 1; i <= n; ++i) {
if (x[i] !=0){
if (a) a=0;
printf("%d ",i);
} } return 0;
}

开灯问题,这题没怎么理解明白,且网上版本众多,各博主写的也更加详细与理解,这里就不班门弄斧了;

还需要自己理解清楚后在添加解释。

第五题:CCF 201712-1 最小差值

【问题描述】

  给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。

【输入形式】

  输入第一行包含一个整数n

  第二行包含n个正整数,相邻整数之间使用一个空格分隔。

【输出形式】

  输出一个整数,表示答案。

【样例输入】

5

1 5 4 8 20

【样例输出】

1

【样例说明】

 相差最小的两个数是5和4,它们之间的差值是1。

【样例输入】

5

9 3 6 1 3

【样例输出】

0

【样例说明】

 有两个相同的数3,它们之间的差值是0。

【评分标准】

 对于所有评测用例,2 ≤ n ≤ 1000,每个给定的整数都是不超过10000的正整数。

#include <stdio.h>
#include "math.h"
int main() {
int n;
int x[1000];
int min;
//数组存储
scanf("%d",&n);
for (int i = 0; i < n; i++) {
scanf("%d",&x[i]);
}
//设第一个差为最小值
min = abs(x[1]-x[0]);
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++) {
//绝对值
if (abs(x[j]-x[i])<min){
min = abs(x[j]-x[i]);
} }
} printf("%d",min);
return 0;
}

解释:

该题逻辑与第一题相似,都是假设最小值,然后进行比较,不过这题的最小值是两个差;

原理都是一样,其中点出abs是绝对值的意思;

第一题是通过下标,这题是通过值;

不多解释,不明白可会看第一题解题思路;

第六题:求最大最小数的差

【问题描述】

编程实现如下的功能:取出一个十进制正整数中的所有偶数数字,用这些数字拼成一个最大整数max,取出这个十进制正整数中的所有奇数数字,用这些数字拼成一个最小整数min,计算max和min的差并输出。

【输入形式】输入一行一个十进制整数

【输出形式】输出一行一个符合规定的整数

【样例输入】

74958106

【样例输出】

7061

【样例说明】max为8640,min为1579,差为7061

#include <stdio.h>
#include "math.h"
int main() {
int n;
int x[100];
int k;
scanf("%d",&n);
int num=0;
while (n != 0){
k = n%10;
x[num] = k;
n = (n-k)/10;
num ++;
} //对列表排序--选择排序
for (int i = 0; i < num-1; ++i) {
int min =i;
for (int j = i+1; j < num; ++j) {
if (x[min]>x[j]){
min=j;
}
}
if (min != i){
int t = x[i];
x[i] = x[min];
x[min] = t;
} }
//查看数组顺序
// for (int i = 0; i < num; ++i) {
// printf("%d",x[i]);
// }
// printf("\n");
int sum1=1;
int minnum = 0;
int maxnum = 0;
//判断偶数
for (int i = 0; i <num; i++) {
if(x[i]%2 == 0 || x[i]==0){
maxnum+=x[i]*sum1;
sum1 *=10;
}
}
//判断奇数
int sum2=1;
for (int i = num-1; i >=0; i--) {
// printf("%d",i);
if(x[i]%2 != 0){
minnum += x[i]*sum2;
sum2 *=10;
}
} // printf("%d %d %d",maxnum,minnum,maxnum-minnum);
printf("%d",maxnum-minnum);
return 0;
}

解释:

首先我们需要明确怎么把输入的一串数字化为单个元素保存到数组中;

可以将每个元素(x)使用10取余得到的尾数存到数组中,再/10缩小范围,直到x=0,结束循环;

scanf("%d",&n);
int num=0;
while (n != 0){
k = n%10;
x[num] = k;
n = (n-k)/10;
num ++;
}

然后需要了解数组/列表(python)中的排序问题;

该题在数组排序中我们采用选择排序;

for (int i = 0; i < num-1; ++i) {
int min =i;
for (int j = i+1; j < num; ++j) {
if (x[min]>x[j]){
min=j;
}
}
if (min != i){
int t = x[i];
x[i] = x[min];
x[min] = t;
} }

数组排序完成后,开始进行奇偶数的判断,将满足条件的元素分别累加乘积;

其中0算在偶数当中;

判断奇数需要翻转数组输出;

//判断偶数
for (int i = 0; i <num; i++) {
if(x[i]%2 == 0 || x[i]==0){
maxnum+=x[i]*sum1;
sum1 *=10;
}
}
//判断奇数
int sum2=1;
for (int i = num-1; i >=0; i--) {
//printf("%d",i);
if(x[i]%2 != 0){
minnum += x[i]*sum2;
sum2 *=10;
}
}

拓展:

选择排序之前python表达的:https://www.cnblogs.com/xbhog/p/11741094.html

总结:

上述题目的解不是唯一,例题中的解是我所理解并运行成功的,如果有不对的地方,欢迎指出。

C语言程序设计之 数组2020-10-28的更多相关文章

  1. C语言程序设计100例之(28):直线蛇形阵

    例28        直线蛇形阵 问题描述 编写程序,将自然数1.2.….N2按蛇形方式逐个顺序存入N阶方阵.例如,当N=3和N=4时的直线蛇形阵如下图1所示. 图1  直线蛇形阵 输入格式 一个正整 ...

  2. 2016 10 28考试 dp 乱搞 树状数组

    2016 10 28 考试 时间 7:50 AM to 11:15 AM 下载链接: 试题 考试包 这次考试对自己的表现非常不满意!! T1看出来是dp题目,但是在考试过程中并没有推出转移方程,考虑了 ...

  3. C语言程序设计(十一) 指针和数组

    第十一章 指针和数组 一旦给出数组的定义,编译系统就会为其在内存中分配固定的存储单元,相应的,数组的首地址也就确定了 C语言中的数组名有特殊的含义,它代表存放数组元素的连续存储空间的首地址 //L11 ...

  4. 全国计算机等级考试二级教程-C语言程序设计_第9章_数组

    四维数组,可用于航天卫星,三维+时间 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> ...

  5. C语言程序设计50例(经典收藏)

    本篇文章是对C语言程序设计的50个小案例进行了详细的分析介绍,需要的朋友参考下 [程序1]题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位.十 ...

  6. C语言学习书籍推荐《C语言程序设计 现代方法(第2版)》下载

    下载地址:点我 C语言仍然是计算机领域的通用语言之一,但现在的C语言已经和当初的时候大不相同了.本书主要的一个目的就是通过一种“现代方法”来介绍C语言,书中强调标准C,强调软件工程,不再强调“手工优化 ...

  7. C语言I博客作业10

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/10095 我在这个课程的 ...

  8. C语言程序设计入门学习五步曲(转发)

    笔者在从事教学的过程中,听到同学抱怨最多的一句话是:老师,上课我也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手.发生这种现象的原因有三个: 一.所谓的看懂听明白,只是很肤浅的 ...

  9. 160809208沈昊辰c语言程序设计实验选择结构设计

    <C语言程序设计>实验报告 学 号 160809208 姓 名 沈昊辰 专业.班 计科16-2班 学    期 2016-2017 第1学期 指导教师 黄俊莲 吴喆 实验地点 C区二层机房 ...

随机推荐

  1. Java Comparable 和 Comparator 接口详解

    本文基于 JDK8 分析 Comparable Comparable 接口位于 java.lang 包下,Comparable 接口下有一个 compareTo 方法,称为自然比较方法.一个类只要实现 ...

  2. Linux的MySQL安装方法

    第一种: APT方式安装 在ubuntu系统的apt软件仓库中,默认存在MySQL数据库 在用户模式下使用命令:  apt/apt-get install mysql-server mysql-cli ...

  3. # js权威指南之对象篇

    对象是js中的关键 属性查找 in,Object.hasOwnProperty(),Object.propertyIsEnumerable()都能检测出对象内是否存在某个属性 in关键字 自有属性/继 ...

  4. mysql-7-join

    #进阶7:连接查询 /* 多表连接:查询的字段来自多个表 按功能分类: 内连接: 等值连接 非等值连接 自连接 外连接: 左外连接 右外连接 全外连接 交叉连接 */ USE girls; SELEC ...

  5. Python练习题 033:Project Euler 005:最小公倍数

    本题来自 Project Euler 第5题:https://projecteuler.net/problem=5 # Project Euler: Problem 5: Smallest multi ...

  6. JDK1.8前_HashMap的扩容机制原理

    最近在研究hashmap的扩容机制,作为一个小白,相信我的理解,对于一些同样是刚刚接触hashmap的白白是有很很大的帮助,毕竟你去看一些已经对数据结构了解透彻的大神谈hashmap的原理等,人家说的 ...

  7. #pragma comment 的使用方法

    转发:https://blog.csdn.net/liruda/article/details/2230617 #pragma comment ( lib,"wpcap.lib" ...

  8. python之线程池和进程池

    线程池和进程池 一.池的概念 池是用来保证计算机硬件安全的情况下最大限度的利用计算机 它降低了程序的运行效率但是保证了计算机硬件的安全从而让你写的程序能够正常运行 ''' 无论是开设进程也好还是开设线 ...

  9. 多测师讲解接口测试 _HTTP常见的状态码归纳_高级讲师肖sir

    100 Continue  初始的请求已经接受,客户应当继续发送请求的其余部分 101 Switching Protocols  服务器将遵从客户的请求转换到另外一种协议 200 OK  一切正常,对 ...

  10. pytest文档43-元数据使用(pytest-metadata)

    前言 什么是元数据?元数据是关于数据的描述,存储着关于数据的信息,为人们更方便地检索信息提供了帮助. pytest 框架里面的元数据可以使用 pytest-metadata 插件实现.文档地址http ...