003 C语言学习笔记

第几个数

题目

在这里插入图片描述

思路

找寻规律,先定义中间值,然后通过k与中间值的比较后,得到其位于偶数数组或是奇数数组,而后得解。

遇到的问题

  1. 本题起初思路为创建数组,前一半为奇数数组,后一半是偶数数组,然后再查找,但由于n,k数值过大,思路不通遂放弃
  2. 开始当成数学问题思考时,忘记了C中‘/’只保留整数,将数组长度为奇数或偶数分开讨论,其实不需要,直接mid = (n+1) / 2即可。

源代码

#include<stdio.h>
int main()
{
    long long n,k,mid,num;
    scanf("%lld %lld",&n,&k);
    mid = (n+1)/2;
    if(k>mid) num = 2 * (k - mid);
    else num = 2 * k - 1;
    printf("%lld",num);
}

收获

规律的找寻很关键。

最少操作次数

题目

在这里插入图片描述

思路

找寻规律。先对数组进行排序,然后用最大值减去最小值即为操作次数 。
因为操作结果只需要让最小的数等于最大的数即可满足题意。

遇到的问题

开始以为是差分数组的应用,但是由于差分数组只能对一个区间的数值进行运算操作,而本题有多个不确定的区间,所以很难操作,开始卡在了这里,但其实本题是个规律题。

源代码

#include <stdio.h>
#define N 60
void DataSort(int num[],int n);
int main()
{
    int n,t,i,j,num[N],re;
    scanf("%d",&t);
    for(j=0; j<t; j++)
    {
        memset(num,0,sizeof(num));
        re = 0;
        scanf("%d",&n);
        for(i=0; i<n; i++)
        {
            scanf("%d",&num[i]);
        }
        DataSort(num,n);
        re = num[0]-num[n-1];
        printf("%d\n",re);
    }
}
void DataSort(int num[],int n)
{
    int i,j,k,temp;
    for(i=0; i<n-1; i++)
    {
        k=i;
        for(j=i+1; j<n; j++)
        {
            if(num[j]>num[k])
            {
                k=j;
            }
        }
        if(k!=i)
        {
            temp = num[k];
            num[k]=num[i];
            num[i]=temp;
        }
    }
}

收获

冒泡排序的巩固+找规律

计算小费

题目

在这里插入图片描述

思路

关键点在于3和4可以组合成大于6的任何数;
即为150和200可以组合成大于300的任何数,而350在大于300后已经无用(可被前两数组合得到)。
经同学讨论后,感觉和哥德巴赫猜想有极小程度的相似(虽然本题中4不为素数且只有两个数)
在这里插入图片描述
感觉挺有意思的.

遇到的问题

开始在下面的分支出现了问题,上界定在了350,忽略了2*150 = 300

 else if(money>=200&&money<300)
        tip = money - 200;

源代码

#include <stdio.h>
int main()
{
    int money,tip,T;
    scanf("%d",&T);
    while(T--)
    {
        tip = 0;
        scanf("%d",&money);
        if(money<150)
            tip = money;
        else if(money>=150&&money<200)
            tip = money - 150;
        else if(money>=200&&money<300)
            tip = money - 200;
        else if(money>=300)
            tip = money % 50;
        printf("%d\n",tip);
    }
}

收获

在多个数字加和求最优解时,注意观察这几个数字和的规律。

18岁生日

题目

在这里插入图片描述

思路

关键节点在于生在2月底之前还是之后。例:
假设生于2019年2月,则到2020年2月时需要+365;
若生于2019年3月,则到2020年3月时需要+366。
即若生于2月底之前,看当年是否为闰年,若是则+366
若生于2月底之后,看下一年是否为闰年,若是则+366

遇到的问题

自己未想出来,在网上找到原题后理解得答。

源代码

#include <stdio.h>
int leap(int year)
{
    if( (year % 4==0 && year % 100!=0) || year % 400==0) return 1;
    else return 0;
}
int main()
{
    int i,n;
    scanf("%d",&n);
    while(n--)
    {
        int year,month,day,sum=0;
        scanf("%d-%d-%d",&year,&month,&day);
        if(month==2&&day==29)
        {
            printf("-1\n");
            continue;
        }
        if(month<=2)
        {
            for(i=0; i<18; i++)
            {
                if(leap(year+i))sum+=366;
                else sum+=365;
            }
        }
        else
            for(i=1; i<=18; i++)
            {
                if(leap(year+i))sum+=366;
                else sum+=365;
            }
        printf("%d\n",sum);

    }
}

收获

本题的关键就是找到那个节点:二月底之前或之后。
希望下次可以独立做出。

额外知识点巩固

整型存储范围
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值