Lab08-数组初步(2019.11.19)
文章目录
1. 向数组插入新元素【简单】
(数组)74. 编写程序向数组增加一个元素,用户输入下标,和插入的元素值,在指定位置插入元素。(假设数组中的数值连续存储,即若有n个数值,则应存储在0-n-1的位置)
输入:
数组个数
数组各个元素
要插入的下标 要插入的元素
输出:
插入后的数组
如输入:
4
2 4 6 8
0 1
输出:
1 2 4 6 8
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i,x,num;
scanf("%d",&n);
int a[n];
int b[n+1];
for(i=0; i<n; i++){
scanf("%d",&a[i]);
}
scanf("%d %d",&x,&num);
b[x] = num;//先放一下,预防往最后一个插数的情况
for(i=0; i<n; i++){
if(i==x){
b[i]=num;
b[i+1]=a[i];//相等,替换,这个位置的数往后串
}
else if(i<x){
b[i]=a[i];//在这个下标之前的数不变
}
else{
b[i+1]=a[i];//在下标之后的数往后串
}
}//以上只能在原数组的下标数位置放
for(i=0; i<(n+1); i++){
printf("%d ",b[i]);
}
return 0;
}
2. 《Beginning C》5.1【简单】
(数组)70.《Beginning C》第五章Array课后习题 5.1,编写一个程序,从键盘读入5个double类型的值,将他们存储在一个数组中。计算每个值的倒数(值x的倒数是1.0/x),将结果存储到另一个数组中。输出这些倒数,并计算和输出倒数的总和。要求输出第一行保留2位小数,第二行保留6位小数
如输入:
1 2 5 10 100
输出:
1.00 0.50 0.20 0.10 0.01
1.810000
#include <stdio.h>
#include <stdlib.h>
int main()
{
double arr[5],darr[5];
double total=0;
for(int i=0; i<5; i++){
scanf("%lf",&arr[i]);
}
for(int i=0; i<5; i++){
darr[i] = 1.0/arr[i];
}
for(int i=0; i<5; i++){
printf("%.2lf ",darr[i]);
}
printf("\n");
for(int i=0; i<5; i++){
total += darr[i];
}
printf("%.6lf",total);
return 0;
}
3. 《Beginning C》5.2【简单】
(数组)71.《Beginning C》第五章Array课后习题 5.2,输出保留4位小数
定义一个数组data,它包含100个double类型的元素。编写一个循环,将以下的数值序列存储在数组的对应元素中。
1/(234) 1/(456) 1/(678) … up to 1/(200201202)
编写另一个循环,计算:
data[0]-data[1]+data[2]-data[3]+…-data[99] 将这个结果乘以4.0,加3.0,输出最后结果
#include <stdio.h>
#include <stdlib.h>
int main()
{
double total=0;
int i;
double data[100];
for(i=0; i<100; i++){
data[i] = 1.0/((2*(i+1))*(2*(i+1)+1)*(2*(i+1)+2));
}
for(i=0; i<100;i++){
if(i%2==0){
total += data[i];
}
else{
total -= data[i];
}
}
total = total*4.0 + 3.0;
printf("%.4lf",total);
return 0;
}
4. 《Beginning C》5.3【简单】
(数组)72.《Beginning C》第五章Array课后习题 5.3,输出中的美分请保留两位小数。
编写一个程序,从键盘读入5个值,将它们存储到一个float类型的数组amounts中。创建两个包含了5个long元素的数组dollars和cents。将amounts数组元素的整数部分存储到dollars的对应元素中,amounts数组元素的小数部分存储到cents中,只保留两位数字(例如amouts[1]的值是2.75,则把2存储到dollars[1]中,把75存储到cents[1]中)。以货币格式输出这两个long类型的数组值(如$2.75)
如输入
1.111 2.22 3.33 4.44 5.55
输出
$1.11 $2.22 $3.33 $4.44 $5.55
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
float amounts[5];
long dollars[5];
long cents[5];
for(i=0; i<5; i++){
scanf("%f",&amounts[i]);
}
for(i=0; i<5; i++){
dollars[i] = (long)amounts[i];
cents[i] = (int)((amounts[i]-(long)amounts[i]+1e-4)*100);
//存疑:加一个小的数怎么就能保证3.32变成3.33了呢
}
for(i=0; i<5; i++){
printf("$%d.%02ld ",dollars[i],cents[i]);
}
return 0;
}
5. 《Beginning C》5.4【简单】
(数组)73.《Beginning C》第五章Array课后习题 5.4
定义一个double类型的二维数组data[l1](5] 。 用2.0~3.0 的值初始化第一列元素 (每步增加0.1)。如果行中的第一个元素值是X, 该行的其他元素值分别是1/x, x2、x3和x^4 。输出数组中的值,每一行放在一行上。
请以如下形式输出,X代表将要输出的数字,句号表示省略部分行,保留4位小数:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j;
double data[11][5]={0};
for(i=0; i<11; i++){
data[i][0] = (2 + 0.1*i);
}
for(i=0; i<11; i++){
data[i][1] = 1/data[i][0];
data[i][2] = data[i][0]*data[i][0];
data[i][3] = data[i][0]*data[i][0]*data[i][0];
data[i][4] = data[i][0]*data[i][0]*data[i][0]*data[i][0];
}
for(i=0; i<11; i++){
for(j=0; j<5; j++){
printf("%.4lf ",data[i][j]);
}
printf("\n");
}
return 0;
}
6. 删除数组元素【中等】
(数组)75.编写程序向数组删除一个元素,用户输入删除的元素值,若该值存在则删除该值在数组中的第一个元素,不存在则返回出错信息。(假设数组中的数值连续存储,即若有n个数值,则应存储在0-n-1的位置)
输入:
数组个数
数组各个元素
要删除的元素
输出:
删除后的数组
如输入:
4
2 4 6 8
2
输出:
4 6 8
如输入:
4
2 4 6 8
10
输出:
ERROR
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,num,flag=0,i,x;
scanf("%d",&n);
int arr1[n];
int arr2[n-1];
for(i=0; i<n; i++){
scanf("%d",&arr1[i]);
}
scanf("%d",&num);
for(i=n-1; i>=0; i--){
if(num==arr1[i]){
flag=1;
x=i;//只删除第一个,请从后往前倒靴靴
}
}
if(flag==0)
printf("ERROR");
else{
for(i=0; i<n; i++){
if(x==i)
arr2[i] = arr1[i+1];
else if(x>i)
arr2[i] = arr1[i];
else
arr2[i] = arr1[i+1];
}
for(i=0; i<n-1; i++){
printf("%d ",arr2[i]);
}
}
return 0;
}
7. 数组元素的查找【中等】
(数组)76.改写讲义中数组线性查找的程序,使其能够返回key在数组中出现的多个位置。(hit,用数组作为参数返回信息)
输入:
数组个数
数组各个元素
要查找的元素
输出:
下标数组(若查询不到输出ERROR)
如输入:
4
2 2 6 8
2
输出:
0 1
如输入:
4
2 4 6 8
10
输出:
ERROR
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,num,flag=0,i,x;
scanf("%d",&n);
int arr[n];
for(i=0; i<n; i++){
scanf("%d",&arr[i]);
}
scanf("%d",&num);
for(i=0; i<n; i++){
if(num==arr[i]){
flag=1;
x=i;
}
}
if(flag==0){
printf("ERROR");
}
else{
for(i=0; i<n; i++){
if(num==arr[i]){
printf("%d ",i);
}
}
}
return 0;
}
8. 我的评分【中等】
聪哥看了主持人大会,他很激动,于是他想用C语言复现节目上的评分系统。
这个评分系统一开始会输入整数n表示有n位评委打分,之后会依次输入n个分数{a1,a2,…,an},聪哥想计算去掉这n个分数中的最高分和最低分之后的平均数。
结果保留两位小数。
比如1 2 3 4 6这个5个数字在这套评分系统中去掉最高分6和最低分1后的平均分数为3
2<n≤100
0≤a1,a2,a3,…,an≤1,000,000,000
样例输入1:
10
98.1 98.2 98.3 98.4 98.5 98.6 98.7 98.8 98.9 99.0
样例输出1:
98.55
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i,j;
scanf("%d",&n);
double scores[1111];
double total=0;
for(i=0; i<n; i++){
scanf("%lf",&scores[i]);
}
double temp;
for(i=0; i<n-1; i++){
for(j=0; j<n-1-i; j++){
if(scores[j] > scores[j+1]){
temp = scores[j];
scores[j] = scores[j+1];
scores[j+1] = temp;
}
}
}
scores[0] = 0;
scores[n-1] = 0;
for(i=0; i<n; i++){
total += scores[i];
}
printf("%.2lf",total/(n-2));
return 0;
}
9. 数字统计【中等】
给定一个 k 位整数 N>0,请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。
【输入格式】
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
【输出格式】
对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。
【提示】
输入:
100311
输出:
0:2
1:3
3:1
#include <stdio.h>
#include <stdlib.h>
int main()
{
char num[1500];
int i;
int count[10]={0};
int a;
scanf("%s",&num);
for(i=0; i<strlen(num); i++){
a = num[i] - '0';
count[a]++;//真是人类的智慧
}
for(i=0; i<10; i++){
if(count[i]!=0)
printf("%d:%d\n",i,count[i]);
}
return 0;
}
10. 长度最小的连续子数组【中等】
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
输入n以及对应的n个值,正整数s,输出数组中满足其和 ≥ s 的长度最小的连续子数组的长度
【输入】
6
2 3 1 2 4 3
7
【输出】
2
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,s;
int sum=0;
int i,j;
scanf("%d",&n);
int min = 1111;
int num[n];
for(i=0; i<n; i++)
scanf("%d",&num[i]);
scanf("%d",&s);
for(i=1; i<=n; i++){
//几个数一组(其实并没有起到从小到大然后在短处截断的作用)
//(助教写的是i=n; i>=1; i--)
for(j=0; j<n-(i-1); j++){//在这个数下需要分多少组
//!!!sum清零才能计算新的!
sum = 0;
//每组分别相加的数之和,设t!!
//k表示数组,t是加的次数,也就是i,加了一组里的几个数
for(int k=j, t=0; t<i; k++, t++){
sum += num[k];
}
if(sum >= s && i<=min){
min = i;
}
}
}
if(min==1111) min=0;
printf("%d",min);
return 0;
}
11. 求最长平台【困难】
(数组)77.给定一个整数数组data,data中连续的相等元素构成的子序列称为平台,编写程序求出b中的最长平台的长度;
如输入:
5
1 2 3 4 5
输出:
1
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i;
scanf("%d",&n);
int a[1000] = {0};
for(i=0; i<n; i++){
scanf("%d",&a[i]);
}
int length = 1, max_pla = 1;
for(i=1; i<n; i++){
if(a[i]==a[i-1]){
length++;
}else{
length=1;
}
if(length >= max_pla){
max_pla = length;
}
}
printf("%d",max_pla);
return 0;
}
12. 大整数相加【困难】
(数组)78.编写程序,实现超长整数的相加。(hint:超长的整数一般无法用long类型来存储,因此需要将用户的输入按照char读入char类型数组,然后再进行处理)
输入:
第一个整数
第二个整数
输出:
两个整数和
如输入:
1111111111111111111111111111111111111111
1111111111111111111111111111111111111111
输出:
2222222222222222222222222222222222222222
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//全局数组的初始值不用初始化即为0
char n1[1500];
char n2[1500];
int total[1500];
char num1[1500];
char num2[1500];
int main()
{
int i,count,max;
scanf("%s%s",n1,n2);
//把数倒过来
for(i=strlen(n1)-1, count=0; i>=0; i--){
num1[count] = n1[i];
count++;
}
for(i=strlen(n2)-1, count=0; i>=0; i--){
num2[count] = n2[i];
count++;
}
max = strlen(num1) >= strlen(num2) ? strlen(num1): strlen(num2);
for(i=0; i<max; i++){
if(num1[i]) total[i] += num1[i] - '0';
if(num2[i]) total[i] += num2[i] - '0';
if(total[i] >= 10){
total[i] -= 10;
total[i+1] ++;
}
}
if(total[max]) printf("%d", total[max]);
for(i=max-1;i>=0;i--){
printf("%d", total[i]);
}
return 0;
}