【日期问题】-C语言解法

目录

目录

今年的第几天?牛客高校复试KY19

1、题目描述

2、个人思路

3、代码展示

KY222 打印日期

1、题目描述

2、思路解说

3、代码展示

KY6 手机键盘

1、题目描述

2、思路分析

3、代码



今年的第几天?牛客高校复试KY19

1、题目描述

描述

输入年、月、日,计算该天是本年的第几天。

输入描述:

包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。

输出描述:

输入可能有多组测试数据,对于每一组测试数据, 输出一个整数,代表Input中的年、月、日对应本年的第几天。

示例1

输入:

1990 9 20
2000 5 1

输出:

263
122

2、个人思路

1990 9 20 

方案一:

1990闰年?1.1-9.1,9.1-9.20

方案二:

1990闰年?

1.1-1.2-1.3-…-9.20

3、代码展示

#include <stdio.h>

int daytab[2][13]= {
	{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
	{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
bool isLeapYear(int year) {
	return (year%400==0 || year%100!=0 && year%4==0);
}

int main() {
	int year, month, day;
	while(scanf("%d %d %d",&year,&month,&day) != EOF){
		int sum = 0;
		int tabrow = isLeapYear(year); //根据是否为闰年确定日期表格的行数(0或1)
		for (int i=0;i<month;i++){  //1.1->9.1
			sum += daytab[tabrow][i]; 
		}
		sum += day; //9.1-9.20 
		
		printf("%d",sum);
	}


	return 0;
}
#include <stdio.h>
int main(){
	int year, month, day;
	int daytab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int totalday[13]={0};//1.1->month.1的值存入数组中,空间换时间
	for (int i=2;i<13;i++){
		totalday[i] = totalday[i-1] + daytab[i-1];
	} 
	
	while(scanf("%d %d %d",&year,&month,&day) != EOF){
		int sum = 0;
		int isLeap = year%400==0 || year%100!=0&&year%4==0; //判断是闰年 
		if(isLeap && month>=3){ //是闰年且在二月之后
			sum = totalday[month] + day + 1;
		}else{
			sum = totalday[month] + day;
		} 
		printf("%d\n",sum);
	}
	
	return 0;
}

区别:1.1-9.1的天数获取方式有差异

提交时间                    运行结果                         运行时间        占用内存        使用语言        详情

5秒前答案正确4ms332KBC
27分钟前答案正确3ms512KBC

②以空间换时间,将1.1-2.1,1.1-3.1,...1.1-12.1的天数存入数组,通过month提取,①每次用for循环数,代码更为简单,但时间稍长。

KY222 打印日期

1、题目描述

描述

给出年分m和一年中的第n天,算出第n天是几月几号。

输入描述:

输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。

输出描述:

可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。

示例1

输入:

2000 3
2000 31
2000 40
2000 60
2000 61
2001 60

输出:

2000-01-03
2000-01-31
2000-02-09
2000-02-29
2000-03-01
2001-03-01

2、思路解说

由天数倒推日期,属于万能模板!简历每个月天数daytab数组,增设mon,day变量初始为0,n范围内for循环,day自增,若日期比该月份实际大,mon自增进入下一个月,day重新归一;day超过12月的31则year增加。注意先判断是否为闰年,再考虑day自增前是否修改daytab[2]。

注意日期输出形式,%02d:占两个字符,不够则前用0补齐。

3、代码展示

#include <stdio.h>

int main() {
	int daytab[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

	int year, n;
	while(scanf("%d %d",&year,&n) != EOF) {
		int isLeap = year%400==0||year%4==0&&year%100!=0;
		//next day
		int day=0,month=1;
		for(int i=0; i<n; i++) {
			if(isLeap) daytab[2]=29;
			day++;
			if(day>daytab[month]) {
				month++;
				day=1;
				if(month>12) {
					year++;
					month = 1;
				}
			}
		}
		printf("%d-%02d-%02d\n",year,month,day);
	}

	return 0;
}

KY6 手机键盘

1、题目描述

描述

按照手机键盘输入字母的方式,计算所花费的时间 如:a,b,c都在“1”键上,输入a只需要按一次,输入c需要连续按三次。 如果连续两个字符不在同一个按键上,则可直接按,如:ad需要按两下,kz需要按6下 如果连续两字符在同一个按键上,则两个按键之间需要等一段时间,如ac,在按了a之后,需要等一会儿才能按c。 现在假设每按一次需要花费一个时间段,等待时间需要花费两个时间段。 现在给出一串字符,需要计算出它所需要花费的时间。

输入描述:

一个长度不大于100的字符串,其中只有手机按键上有的小写字母

输出描述:

输入可能包括多组数据,对于每组数据,输出按出Input所给字符串所需要的时间

示例1

输入:

bob
www

输出:

7
7

2、思路分析

使用map。要提前确定的是:按哪个键,按几下。每输入一个键,比较与上一个是否相同,判断是否需要等待,再进行根据两个map确定输入时间。

3、代码

#include <cstdio>
#include <map>

using namespace std;

int main() {
	//map1:字母在哪个键 
	map<char,int> keyMap = {
		{"a",2},{"b",2},{"c",2},
		{"d",3},{"e",3},{"f",3},
		{"g",4},{"h",4},{"i",4},
		{"j",5},{"k",5},{"l",5},
		{"m",6},{"n",6},{"o",6},
		{"p",7},{"q",7},{"r",7},{"s",7},
		{"t",8},{"u",8},{"v",8},
		{"w",9},{"x",9},{"y",9},{"z",9}
	};
	//map2:字母需要输入几次 
	map<char,int> inputTime = {
		{"a",1},{"b",2},{"c",3},
		{"d",1},{"e",2},{"f",3},
		{"g",1},{"h",2},{"i",3},
		{"j",1},{"k",2},{"l",3},
		{"m",1},{"n",2},{"o",3},
		{"p",1},{"q",2},{"r",3},{"s",4},
		{"t",1},{"u",2},{"v",3},
		{"w",1},{"x",2},{"y",3},{"z",4}
	};
	char str[101];
	while(scanf("%s",str) != EOF ){
		int LastInput = 1;//初始时设置上一次输入的键和其他不同
		int totalTime = 0;
		for(int i=0;str[i]!='\0';i++){
			if(LastInput==keyMap[str[i]]){//输入相同则等待 
				totalTime += 2;
			}
			totalTime += inputTime[str[i]];
			LastInput = keyMap[str[i]];
		} 
		printf("%d\n",totalTime);
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 学习51单片机和C语言编程,可以帮助我们更深入地理解嵌入式系统的原理和工作方式。对于初学者来说,掌握一份适合自己的学习资料非常重要。 要学习51单片机-C语言版,可以阅读《手把手教你学51单片机-C语言版pdf》这本电子书,这本书内容丰富,讲解详细,配合实例编程,非常适合初学者自学。以下是学习本书的几个关键点: 第一,掌握基本的硬件知识,包括单片机的结构和特性,尤其是各种寄存器的作用和配置方法。 第二,了解C语言编程基础,尤其是语法、数据类型、运算符、控制结构、函数等,这是编写单片机程序的基础。 第三,通过实例编程加强对知识的理解和运用能力。例如,可以尝试写一些简单的IO控制、定时器中断、串口通讯等程序。 第四,可以搭配相应的开发板和开发环境进行实践学习。例如,可以使用STC89C51开发板和Keil或SDCC开发环境。 总之,《手把手教你学51单片机-C语言版pdf》这本电子书是一个不错的学习资料,但也需要具备一定的基础知识和耐心,可以结合其他资料和实践不断提高自己的能力。 ### 回答2: 学习51单片机-c语言版, 需要基础的C语言编程知识。在学习前,先要熟悉C语言的数据类型、循环、判断及函数等语法结构,并掌握C语言的编写方法。 在学习51单片机-c语言版之前,需要准备好学习环境,如下载并安装Keil软件, 安装并关联好相应的单片机模拟器。Keil软件中有类似于记事本的编辑窗口用来编写C语言代码, 以及编译,调试和下载程序到单片机等功能。 在学习时,可以选择一些简单的例程开始学习,逐步理解其代码逻辑,了解基本的寄存器操作和中断等知识。可以从LED灯等简单的实验开始,逐渐增加难度和功能的复杂度。 同时,可以参考一些权威的学习资料如《单片机原理与应用》、《51单片机学习与应用》等相关书籍,或结合网络资源进行学习。在学习过程中,需要勤加练习,多编写代码进行实践,同时多与他人交流学习体会和技术问题。通过坚持不断的学习和练习,便可以逐步掌握51单片机-c语言版编程技巧,提高自己的单片机应用开发能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值