《算法笔记》2.5小节——C/C++快速入门->数组

问题 A: 习题6-4 有序插入

题目描述

有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入到数组中。

假设数组长度为10,数组中前9个数(这9个数要求从键盘上输入,输入时要满足自小到大的输入顺序)已经按从小到大进行排序。

然后再从键盘上输入一个整数,将此整数插入到前有序的9个数中,使得最终的10个数依然是从小到大有序的。

输入

第一行输入以空格分隔的9个整数数,要求按从小到大的顺序输入。

第二行输入一个整数。

输出

从小到大输出这10个数,每个数一行。

样例输入 

   1 11 21 31 41 51 61 71 81
   45

样例输出  

   1
   11
   21
   31
   41
   45
   51
   61
   71
   81

解题思路 

1.输入数组中的前九个数

2.再输入一个整数

3.通过冒泡排序 定义中间变量temp 依次比较第二次输入的整数和前九个数 

代码实现

#include <stdio.h>
int main()
{
	int a[10];
	for(int i = 0; i < 9; i++){
		scanf("%d",&a[i]); //输入数组中的前九个数
	}
	scanf("%d",&a[9]); //再输入一个整数
	for(int i = 9; i > 0; i--){
		if(a[i]<a[i-1]){
			int temp=a[i-1];
			a[i-1]=a[i];
			a[i]=temp; //通过定义中间变量temp,如果左边的数更大交换a[i-1]和a[i]
		}
	}
		for (int j = 0; j < 10; j++)
		{
			printf("%d\n", a[j]);
		}
	return 0;
}

问题 B: 习题6-5 数组元素逆置

题目描述

将一个长度为10的整型数组中的值按逆序重新存放。

如:原来的顺序为1,2,3,4,5,6,7,8,9,0,要求改为0,9,8,7,6,5,4,3,2,1

输入

从键盘上输入以空格分隔的10个整数。

输出

按相反的顺序输出这10个数,每个数占一行。

样例输入 

   1 2 3 4 5 6 7 8 9 0

样例输出  

   0
   9
   8
   7
   6
   5
   4
   3
   2
   1

解题思路 

这个是逆序输出,不用比较大小,直接定义中间变量,然后从右往左排序

代码实现

#include <stdio.h>
int main()
{
	int a[10];
	for (int i = 0; i < 10; i++){
		scanf("%d",&a[i]); //输入10个整数,以空格隔开
	}
	//定义中间变量逆序输出,注意这里i<5,不是10,如果是10,就变成了从小到大排序
	for (int i = 0; i < 5; i++){ 
		int temp = a[i];
		a[i] = a[9-i];
		a[9-i] = temp;
	}
	for (int i = 0; i < 10; i++){
		printf("%d\n", a[i]);
	}
	return 0;
}

问题 C: 习题6-6 杨辉三角

题目描述

按要求输入如下格式的杨辉三角

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

最多输出10层

输入

输入只包含一个正整数n,表示将要输出的杨辉三角的层数。

输出

对应于该输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开。

样例输入 

   5

样例输出  

   1
   1 1
   1 2 1
   1 3 3 1
   1 4 6 4 1

解题思路 

杨辉三角形规则
1.首列和每行最后一个都为1:a[i][j]=1
2.每行的第二个元素都是上一行的前一个和后一个元素之和:
   a[i][j]=a[i-1][j]+a[i-1][j-1]

代码实现

#include <stdio.h>
int main()
{
	int n,a[10][10]; //定义输出层数 和一个最多为10层的数组
	scanf("%d",&n);
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j <= i; j++)
		{
			if(j==0 || j==i){ //首列和每行最后一个都为1
			a[i][j]=1;
		    }
		    else{ //每行的第二个元素都是上一行的前一个和后一个元素之和
			a[i][j]=a[i-1][j]+a[i-1][j-1]; 
		    }
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j <= i ; j++)
		    printf("%d\n",a[i][j]);
	}
	return 0;
}

问题 D: 习题6-12 解密

题目描述

有一行电文,已按如下规律译成密码:

A-->Z        a-->z

B-->Y        b-->y

C-->X        c-->x

......          ......

即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。

输入

输入一行密文。

输出

解密后的原文,单独占一行。

样例输入 

   ZYX123zyx

样例输出  

   ABC123abc

解题思路 

根据ASCII码表中字母序号的大小关系进行思考,设想:
任何一个字母必处于a和z之间
字母a码值=x+1(1即第一位字母) 97=x+1 x=96
字母z码值=x+26(26即第二十六位字母) 122=x+26 x=96
第i位字母码值=x+i
所求转换后字母码值=x+26-i+1=x+27-i = (x+1)+(x+26)-(x+i)
因此可得 a[i]=‘a’+‘z’-a[i] 
同理可得大写也是如此

代码实现

#include<stdio.h>
int main()
{
	char str[50];
	gets(str);
	for(int i = 0; i<50 ; i++)
	{
		if(str[i] <= 'z' && str[i] >= 'a')
		str[i] = 'a' + 'z' - str[i];
		if(str[i] <= 'Z' && str[i] >= 'A')
		str[i] = 'A' + 'Z' - str[i];
	}
	puts(str);
	return 0;
} 

问题 E: 习题6-13 字符串比较

题目描述

比较两个字符串s1和s2的大小,如果s1>s2,则输出一个正数;若s1=s2,则输出0;若s1<s2,则输出一个负数。

要求:不用strcpy函数;两个字符串用gets函数读入。

例如:"A"与"C"相比,由于"A"<"C",应输出负数,同时由于"A"与"C"的ASCII码差值为2,因此应输出"-2"。

同理:"And"和"Aid"比较,根据第2个字符比较的结果,"n"比"i"大5,因此应该输出"5"

输入

输入2行字符串。

输出

一个整数,表示这两个字符串 比较的差值,单独占一行。

样例输入 

   And
   Aid

样例输出  

   5

解题思路 

这个是要输出数值,所以不能用strcmp(),用strlen()

代码实现

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[50],str2[50];
	gets(str1);
	gets(str2);
	for (int i = 0; i < strlen(str1); i++) 
	{//这里用strlen()获得第一个\0前的字符串个数
		if (str1[i] != str2[i]) //如果str1和str2不相等
		{
			printf("%d\n", str1[i]-str2[i] ); //则输出一个正数或者负数
			return 0;
		}
		else{
			if (i+1 == strlen(str1)) //如果s1=s2,即字符串大小一样,输出0
			printf("0\n");
		}
	}
}

问题 F: 例题6-1 逆序输出数组元素

题目描述

从键盘上输入10个整数,存储在一个长度为10的整型数组中,要求将输入的10个数逆序输出。

如输入为:0,1,2,3,4,5,6,7,8,9 输出为9,8,7,6,5,4,3,2,1,0

输入

10个整数,以空格分隔

输出

将输入的10个整数逆序输出,每个数占一行。

样例输入 

   0 1 2 3 4 5 6 7 8 9

样例输出  

   9
   8
   7
   6
   5
   4
   3
   2
   1
   0

代码实现

#include <stdio.h>
int main()
{
	int a[10];
	for (int i = 0; i < 10; i++)
	{
		scanf("%d",&a[i]);
	}
	for (int i = 0; i <= 9; i++)
	{ 
		for (int j = 0; j < 9-i; j++)
		{
			if(a[j+1]>a[j])
		   {
			int temp = a[j+1];
		    a[j+1] = a[j];
		    a[j] = temp;
		   }	
		}
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", a[i]);
	}
	return 0;
}

问题 G: 例题6-2 数组求解Fibonacci数列问题

题目描述

Fibonacci数列的特点:第1,2个数为1,1。从第3个数开始,概述是前面两个数之和。即: 

要求输出Fibonacci数列的前20个数。

输入

输出

Fibonacci数列的前20个数,每个数占一行。

样例输入 

       无 

样例输出  

   1
   1
   2
   3
   5
   8
   13
   21
   34
   55
   89
   144
   233
   377
   610
   987
   1597
   2584
   4181
   6765

解题思路 

1.第一个和第二个都是1 str1[0]=1,str1[1]=1

 2.第三个开始,是前两个数之和:str1[i]=str[i-1]+str[i-2](2<=i<20)

代码实现

#include <stdio.h>
int main()
{
	int str[20];
	str[0]=1,str[1]=1; //第一个和第二个都是1
	for (int i = 2; i < 20; i++)
	{
		str[i]=str[i-1]+str[i-2]; //第三个开始,都是前两个数之和
	}
	for (int i = 0; i < 20; i++)
	{
		printf("%d\n", str[i]);
	}
	return 0;
}

问题 H: 例题6-3 冒泡排序

题目描述

从键盘上输入10个整数,用冒泡法对这10个数进行排序(由小到大)。

输入

以空格分隔的10个整数。

输出

依次输出排好序的10个整数,每个数占一行。

样例输入 

   1 3 5 7 9 2 4 6 8 0

样例输出  

   0
   1
   2
   3
   4
   5
   6
   7
   8
   9

解题思路 

和逆序输出解题思路相同

代码实现

#include <stdio.h>
int main()
{
	int a[10];
	for (int i = 0; i < 10; i++)
	{
		scanf("%d",&a[i]);
	}
	for (int i = 0; i <= 9; i++)
	{ 
		for (int j = 0; j < 9-i; j++)
		{
			if(a[j]>a[j+1]) //和逆序输出的不同
		   {
			int temp = a[j];
		    a[j] = a[j+1];
		    a[j+1] = temp;
		   }	
		}
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", a[i]);
	}
	return 0;
}

问题 I: 例题6-4 矩阵转置

题目描述

将一个2行3列的矩阵(二维数组)行列互换,存储到另一个3行2列的矩阵中。

要求以整型数据为例来解答。

输入

输入2行数据,每行3个整数,以空格分隔。

输出

行列互换后的矩阵,3行,每行2个数据,以空格分隔。

样例输入 

   1 2 3
   4 5 6

样例输出  

   1 4
   2 5
   3 6

代码实现

#include <stdio.h>
int main(){ 
	int a[2][3];
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++) 
		{
			scanf("%d",&a[i][j]); //输入2个长度为3的数组
		}
	}
	//转化成3个长度为2的数组
	for (int i = 0; i < 3; i++) 
	{ 
		for (int j = 0; j < 2; j++) 
		{
			printf("%d ",a[j][i]);
		}
	}
	return 0;
}

问题 J: 例题6-9 字符串求最大值

题目描述

从键盘上输入3个字符串,求出其中最大者。

输入

输入3行,每行均为一个字符串。

输出

一行,输入三个字符串中最大者。

样例输入 

   England
   China
   America

样例输出  

   England

解题思路

 strcpy():将后一个字符串复制给前一个字符串
 strcmp():比较字符串大小

代码实现

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[50],str2[50],str3[50],smax[50];
	gets(str1);
	gets(str2);
	gets(str3);
	strcpy(smax,str1); //先把str1复制给smax,以str1作为比较字符串
	if(strcmp(str2,smax)>0)
		strcpy(smax,str2); //如果str2比smax大,即str2>str1
	if (strcmp(str3,smax)>0) 
		strcpy(smax,str3); //如果str3比smax大,则最终输出str3
	puts(smax);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值