牛客C刷题(一维数组)(1)

题目1:

有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。

输入描述:

第一行输入一个整数N(0≤N≤50)。
第二行输入N个升序排列的整数,输入用空格分隔的N个整数。
第三行输入想要进行插入的一个整数。

输出描述:

输出为一行,N+1个有序排列的整数。

方法一:

投机取巧:以插入的数m为分水岭,先遍历数组输出比m小的,然后输出m,再遍历数组,输出比m大的,本质上没有真的把数插入数组里,只是在输出结果上做文章。

int main()
{
    int n=0;
    scanf("%d",&n);
    int arr[50];
    int i=0;
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    int m=0;
    scanf("%d",&m);
    for(i=0;i<n;i++)
    {
    
       if(arr[i]<=m)
       {
            printf("%d ",arr[i]);
       }
    }

    printf("%d ",m);

    for(i=0;i<n;i++)
    {
        if(arr[i]>m)
        {
            printf("%d ",arr[i]);
        }
    }
    return 0;
}

方法二:

认认真真把数插入数组里,然后输出

int main()
{
    int n,insert;
    scanf("%d",&n);
    int arr[50];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    scanf("%d",&insert);

    for(int i=0;i<n;i++)
    {
        if(insert<arr[i])//定位插入位置
        {
            for(int j=n+1;j>i;j--)//后面全都往后窜一位
            {
                arr[j]=arr[j-1];
            }
            arr[i]=insert;
            break;
        }
        arr[n]=insert;//要插入的值比所有原数组中所元素都大,放在末尾
    }

    for(int i=0;i<n+1;i++)
    printf("%d ",arr[i]);
    return 0;
}

题目2:

有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。

输入描述:

第一行输入一个整数(0≤N≤50)。

第二行输入N个整数,输入用空格分隔的N个整数。

第三行输入想要进行删除的一个整数。

输出描述:

输出为一行,删除指定数字之后的序列。

方法一:

投机取巧:遍历数组,输出数组中 不等于 指定删除数  的数字,本质上没有真的把数从数组里删除,只是在输出结果上做文章。

#include <stdio.h>

int main() 
{
    int n=0;
    scanf("%d",&n);
    int arr[51]={0};
    int i=0;
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    int del=0;
    scanf("%d",&del);

    for(i=0;i<n;i++)
    {
       if(arr[i]!=del)
       {
         printf("%d ",arr[i]);
       }
    }
    return 0;
}

方法二:认认真真在数组中删除该数字

int main()
{
    int n = 0;
    scanf("%d", &n);
    int arr[51] = { 0 };
    int i = 0;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    int del = 0;
    scanf("%d", &del);

    for (i = 0; i < n; i++)
    {
        if (arr[i] == del)
        {
            
            for (int j = i ; j <n; j++)//后面全都往前移一位
            {
                arr[j] = arr[j + 1];
            }
            n--;//每删除一次,打印的时候就少打印一位
            i--;
        }
    }
    for (i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

题目3:输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。

输入描述:

第一行输入一个整数N(3≤N≤50)。

第二行输入N个整数,用空格分隔N个整数。

输出描述:

输出为一行,如果序列有序输出sorted,否则输出unsorted。

答案:

有序的3种情况:

1.从小到大:1 2 5 7 9

2.从大到小:9 7 6 3 1

3.每个数字大小都一样:1 1 1 1 1 1

解决思路:

把前一个和后一个作差,如果大于0,计数器count1就++,若是最后count1=n-1,则说明数列后一个数都比前一个数小,这就是从大到小的有序。

把前一个和后一个作差,如果小于0,计数器count2就++,若是最后count2=n-1,则说明数列后一个数都比前一个数大,这就是从小到大的有序。

差等于0同理。

如果最后count1和count2没有一个等于n-1,说明这个数列无序 

#include <stdio.h>

int main() 
{
    int arr[50] = { 0 };
    int n=0;
    scanf("%d",&n);
    int i=0;
    int count1=0;
    int count2 = 0;
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    for(i=0;i<n-1;i++)
    {
            if (arr[i] >= arr[i + 1])
            {
                count1++;
            }
            else if(arr[i]<=arr[i+1])
            {
                count2++;
            }
    }
    if (count1==n-1 || count2==n-1)
    {
        printf("sorted");
    }
    else
    {
        printf("unsorted");
    }
    return 0;
}

题目4:

用筛选法求n以内的素数。筛选法求解过程为:将2~n之间的正整数放在数组内存储,将数组中2之后的所有能被2整除的数清0,再将3之后的所有能被3整除的数清0 ,以此类推,直到n为止。数组中不为0 的数即为素数。

输入描述:

多组输入,每行输入一个正整数(不大于100)。

输出描述:

针对每行输入的整数n,输出两行,第一行,输出n之内(包括n)的素数,用空格分隔,
第二行,输出数组中2之后被清0 的个数。每行输出后换行。

#include <stdio.h>
int main() {
    int n=0;
    int arr[100]={0};
    while (scanf("%d",&n)!= EOF) 
    { 
        int i=0;
        int j=0;
        for(i=2;i<=n;i++)
        {
            arr[i]=i;
        }
        for(int i=2;i<=n;i++)
        {
            for(j=2;j<i;j++)
            {
                if(i%j==0)
                {
                    arr[i]=0;//只要i能被2-i之间的数整除就清零
                }
            }
        }
        int count=0;
        for(i=2;i<=n;i++)
        {
            if(arr[i]!=0)
            {
                printf("%d ",arr[i]);
            }
            else
            {
                count++;
            }
        }
        printf("\n%d",count);
    }
    return 0;
}

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值