题目65:求n天后的日期
写一个函数,传入年月日,计算它的第二天,并返回该日期。由用户输入年月日和一个n值,使用前述函数,计算该日期加n天的日期为多少。
输入year,month,day和n共4个正整数,以空格分隔。n的值不超过2000。
输出计算得到的结果年月日共3个正整数,整数之间以一个空格分隔,行首与行尾无多余空格。
总结:
-
计算一个日期的第二天,令day++,判断此时day是否在该月的范围内,若不在说明第二天是下个月,令 day = 1,month++,若月份+1后大于12,则第二天进入了下一年,令 month = 1,year++
-
求n天后的日期,调用求第二天的日期 n 次即可
cpp
#include <stdio.h>
//判断是否为闰年
int isLeapYear(int year){
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
//获取某个月的天数
int getDaysInMonth(int year, int month){
int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear(year)) {
daysInMonth[1] = 29;
}
return daysInMonth[month - 1];
}
//计算第二天日期
void nextDay(int *year, int *month, int *day){
(*day)++;
int daysInMonth = getDaysInMonth(*year, *month);
if(*day > daysInMonth){
*day = 1;
(*month)++;
if(*month > 12){
*month = 1;
(*year)++;
}
}
}
//计算加n天后的日期
void addNDays(int *year, int *month, int *day, int n){
for(int i = 0; i < n; i++){
nextDay(year, month, day);
}
}
int main(){
int year, month, day, n;
scanf("%d %d %d %d", &year, &month, &day, &n);
addNDays(&year, &month, &day, n);
printf("%d %d %d", year, month, day);
return 0;
}
题目71:发牌
编制一个模拟发牌的程序。有编号为1,2,3,4四个人,将一付去掉大小怪的扑克按照如下顺序排列梅花c0-c12,方块d0-d12,红桃h0--h12,黑桃s0-s12,然后按照1,2,3,4四个人的顺序发牌,问最后每个人手上的牌有哪些。
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由一行组成。每组数据包含一个在1到4之间的整数,代表四个人中的一个,在行首和行尾没有多余的空格。
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)依次输出一组对应的答案。对于每组输入,输出那个人手上的牌。每组一行。每行包括13张牌,每张牌由牌的花色和牌的大小组成。牌的花色和牌的大小之间有一个空格,前后两张牌之间也有一个空格。其余数据前后没有多余的空格,两组数据之间也没有多余的空行。
总结:
-
用二维数组 arr[4][13], arr1[4][13]存储四个人手中的牌,arr[4][13]存储花色,arr1[4][13]存储数字一列一列的对牌进行赋值,每发完13张牌修改花色和数字,直至牌发完
-
要求第 n 个人手中的牌,按行一起输出 arr[n - 1][i],arr1[n - 1][i]
cpp
#include <stdio.h>
int main(){
int n, count = 0, m = 0;
char k = 'c';
char arr[4][13];
int arr1[4][13];
for(int j = 0; j < 13; j++){
for(int i = 0; i < 4; i++){
arr[i][j] = k;
arr1[i][j] = m++;
count++;
if(count == 13){
k = 'd';
m = 0;
}
if(count == 26){
k = 'h';
m = 0;
}
if(count == 39){
k = 's';
m = 0;
}
}
}
while(scanf("%d", &n) != EOF){
for(int i = 0; i < 13; i++){
printf("%c %d", arr[n - 1][i], arr1[n - 1][i]);
if(i < 12)
printf(" ");
}
printf("\n");
}
return 0;
}
题目72:数字金字塔
考虑在下面被显示的数字金字塔(第n行有n列)。写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每前进一步可以走到它的正下方或者右下方(往下一行、往右一列)的位置。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30
输入第一个行包含 R(1<= R<=1000) ,表示行的数目。后面每行为这个数字金字塔特定行包含的整数。所有的被供应的整数是非负的且不大于100。
输出仅一行,包含那个可能得到的最大的和。
总结:
-
用二维数组 arr[r][r] 存储输入的 r 层数字金字塔
-
自底向上,从底层开始,把每两个相邻的数组值相加到他们的上一行,即计算每一层每个位置到底部的最大路径和,计算到最顶部位置的值就是全局最优解
cpp
#include <stdio.h>
int max(int a, int b){
return a > b ? a : b;
}
int main(){
int r, sum = 0;
scanf("%d", &r);
int arr[r][r];
for(int i = 0; i < r; i++){
for(int j = 0; j <= i; j++){
scanf("%d", &arr[i][j]);
}
}
//从底部向上计算最优路径
for(int i = r - 2; i >= 0; i--){
for(int j = 0; j <= i; j++){
//每个位置的最优值 = 当前位置值 + 下一行两个可能位置的最大值
arr[i][j] += max(arr[i + 1][j], arr[i + 1][j + 1]);
}
}
printf("%d", arr[0][0]);
return 0;
}


翻译:
2.供应链管理
供应链管理被公司用于确保他们的供应链高效和性价比高的一个过程。供应链系统可以得到物联网系统的帮助。这个想法是根据最终客户的要求,管理参与产品制造,运输和服务相关企业或合伙人网络。在任何特定时刻,市场动力可能会要求在供应链中的供应商,物流供应商和顾客,和许多专业参与者做出改变。可变性在供应链基础设施上有重大影响,从建立贸易伙伴之间的电子通信的基础层到更复杂的流程配置和对快速生产过程至关重要的工作流程安排。
3.智能电网与智能建筑
一个关键的物联网应用是智能电网的发展。美国各地的各种电力公司都有或处于更新他们电力管理和分配系统的过程中。个人家中的传感器(恒温器)可以收集通过互联网给可以应用复杂电力管理和向电网发送控制信号以节约能源的主要站点(可能甚至是当地的"枢纽")发送的信息。智能电网可以通过给电力产品,运输,分配和小号应用感知,测量和控制设备来实现。
物联网已被建议用于在居住的,商业的,工业的和政府设置的智能建筑上。智能建筑可以是商场或者家,医院或者高层办公楼。智能建筑需要对热量,空调,灯和环境改变的监控和管理。它们可以预见建筑的安全,火灾扑救和电梯运行。智能建筑技术聚焦于带来更多详细的监测和感知建筑的"意识"。
单词:
