Lab08-数组初步(2019.11.19)

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;
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值