OJ题库:计算日期到天数转换、打印从1到最大的n位数 、尼科彻斯定理

简介: OJ题库:计算日期到天数转换、打印从1到最大的n位数 、尼科彻斯定理

HJ73 计算日期到天数转换

题目相关消息

题目描述

根据输入的日期,计算是这一年的第几天。

保证年份为4位数且日期合法。

进阶:时间复杂度: O(n) ,空间复杂度: O(1)

输入描述

输入一行,每行空格分割,分别是年,月,日

输出描述

输出是这一年的第几天

示例

输入:2012 12 31

输出:366

输入:1982 3 4

输出:63

分析问题解决思路

题目让我们输出有多少天,只要解决了以下俩个小问题,问题就迎刃而解了

  1. 闰年的情况,我们需要判断输入是否是闰年,在闰年内,2月是29天,这是与正常平年不同的情况,因此我们需要设计和函数来判断是否是闰年
  2. 我们在判断的时候应该使用累加的思想,从1月累加到目标月,但是值得注意的一点是,目标月不能直接加当前月份总的天数,应该加上用户输入的天数

具体实现细节:

       首先我们需要先设计一个判断闰年的函数,如果是闰年就返回1,不是就返回0,方便后续进行调用判断:

int judgeleapyear(int year)
{
  if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
  {
    return 1;
  }
  else
    return 0;
}

  主函数方面,我们定义一个整形变量 days 来记录从这一年的第一天到现在一共有多少天,定义 year, month, day三个整形变量分别来记录用户输入的值,从一月开始遍历到目标月,不包含目标月,如果是大月 days 就加31,如果是小月就加30,另外在2月的时候,使用一个 if 语句来判断当前 2 月有多少天

        //大月
    if ((months == 1) || (months == 3) || (months == 5) || (months == 7) || (months == 8) || (months == 10) || (months == 12))
    {
      days += 31;
    }
    //小月
    else if ((months == 4) || (months == 6) || (months == 9) || (months == 11))
    {
      days += 30;
    }
    //二月
    else
    {
      //润年
      if (ret == 1)
      {
        days += 29;
      }
      //平年
      else
      {
        days += 28;
      }
    }

完整代码实现

//HJ73
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int judgeleapyear(int year)
{
  if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
  {
    return 1;
  }
  else
    return 0;
}
int main()
{
  int year = 0;
  int month = 0;
  int day = 0;
  int days = 0;
  scanf("%d %d %d", &year, &month, &day);
  //判断是否是闰年
  int ret = judgeleapyear(year);
  //从一月加到目标月
  for (int months = 1; months < month; months++)
  {
    //大月
    if ((months == 1) || (months == 3) || (months == 5) || (months == 7) || (months == 8) || (months == 10) || (months == 12))
    {
      days += 31;
    }
    //小月
    else if ((months == 4) || (months == 6) || (months == 9) || (months == 11))
    {
      days += 30;
    }
    //二月
    else
    {
      //润年
      if (ret == 1)
      {
        days += 29;
      }
      //平年
      else
      {
        days += 28;
      }
    }
  }
  days += day;
  printf("%d", days);
  return 0;
}

JZ17 打印从1到最大的n位数

题目相关消息

描述

    输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

  1. 用返回一个整数列表来代替打印
  2. n 为正整数,0 < n <= 5

示例

输入:1

返回值:[1,2,3,4,5,6,7,8,9]

    注意,这道题目是接口题,我们只需要完善题目给出的函数就可以了,将需要返回的值返回就完成了

int* printNumbers(int n, int* returnSize)
{
}

分析问题解决思路

       首先,我们需要明确一件事,这道题是接口题,我们不能像普通的 ACM 模式的题那样写个循环直接打印,我们需要将数据放在一块空间内,然后将其返回


       既然是要放在空间内,那我们就使用 malloc 函数来动态开辟空间,最后在这些空间内逐个赋值就可以了

具体实现细节

       首先我们得先明确数值的范围,如下所示的过程中,我们不难发现,这是次方的关系,也就是说 10^n-1 就是数值的最大值


  • 1 位数的数值就是 1~9
  • 2 位数的数值就是 1~99
  • 3 位数的数值就是 1~999
  • 4 位数的数值就是 1~9999

 那么在这里我们就使用 <math.h> 头文件中的库函数 pow 来实现次方的效果,这样我们就获得了数值的大小范围

    //返回数组元素的个数
    *returnSize = pow(10, n) - 1;

接下来就是动态分配空间,在这里需要注意的是要进行强制类型转化,不然会因为前后类型不一致导致 bug,一个整形大小是 sizeof(int),一共有 *returnsize 个整形

     //动态分配空间
    int* arr = (int*)malloc(*returnSize * sizeof(int));//malloc(字节数)

最后赋值就非常简单了,使用 for 循环实现就可以了

    //赋值
    for (int i = 0; i < *returnSize; ++i)
    {
        *(arr + i) = i + 1;
    }

完整代码实现

int* printNumbers(int n, int* returnSize)
{
    //返回数组元素的个数
    *returnSize = pow(10, n) - 1;
    //动态分配空间
    int* arr = (int*)malloc(*returnSize * sizeof(int));//malloc(字节数)
    //赋值
    for (int i = 0; i < *returnSize; ++i)
    {
        *(arr + i) = i + 1;
    }
    //返回
    return arr;
}

HJ76 尼科彻斯定理

题目相关信息

题目描述


验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和


例如:


1^3=1


2^3=3+5


3^3=7+9+11


4^3=13+15+17+19


输入一个正整数m(m≤100),将m的立方写成m个连续奇数之和的形式输出


数据范围: 1≤m≤100


进阶:时间复杂度:O(m) ,空间复杂度:O(1)  

输入描述

输入一个int整数

输出描述

输出分解后的string

示例

输入:6

输出:31+33+35+37+39+41

分析问题解决思路

首先,我们必须得理解这个题目背后的数学原理,我们举例如下

       我们会发现,在多项式中的第一项和最后一项是有迹可循的,我们对于第一项和最后一项的总结如下

  1. 第一项:(n-1)^2+((n-1)-1)+2
  2. 最后一项:n^2+(n-1)

具体实现细节

我们先使用俩个变量来找到刚才所描述的第一项和最后一项

  int m_first = 0;
  int m_end = 0;
  m_first = (m - 1) * (m - 1) + (((m - 1) - 1) + 2);
  m_end = (m * m) + (m - 1);

在找到第一项后,我们就可以使用遍历累加来打印了,在尼科彻斯定理表示的多项式中,多项式的数量要表达的整数m是一样的,都是m,基于此,我们就可以使用循环了,每一次都打印一个奇数,然后在让这个奇数加 2,最后再直接打印最后一项

  for (int i = 0; i < (m - 1); i++)
  {
    printf("%d+", m_first);
    m_first += 2;
  }
  printf("%d", m_end);

完整代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
void math_N(int m)
{
  int m_first = 0;
  int m_end = 0;
  m_first = (m - 1) * (m - 1) + (((m - 1) - 1) + 2);
  m_end = (m * m) + (m - 1);
  for (int i = 0; i < (m - 1); i++)
  {
    printf("%d+", m_first);
    m_first += 2;
  }
  printf("%d", m_end);
}
int main()
{
  int m = 0;
  scanf("%d", &m);
  math_N(m);
  return 0;
}

本次分享就到此结束了,希望我的分享对您有所帮助

目录
相关文章
|
3月前
|
存储 C语言
牛客网刷题总结(1.有序序列判断,2.获得月份天数,3.矩阵相等判定,4.矩阵转换,5.井字棋判断输赢,6.递归进行进制转化)
牛客网刷题总结(1.有序序列判断,2.获得月份天数,3.矩阵相等判定,4.矩阵转换,5.井字棋判断输赢,6.递归进行进制转化)
39 0
|
1月前
|
索引
每日一题吼吼吼(打印从1到最大n位数,计算是第几天)
每日一题吼吼吼(打印从1到最大n位数,计算是第几天)
12 0
|
4月前
|
C语言
c语言编程练习题:7-19 计算天数
本题要求编写程序计算某年某月某日是该年中的第几天。
23 1
|
9月前
牛客网刷题—— 计算日期到天数转换
牛客网刷题—— 计算日期到天数转换
|
C语言 Python
【蓝桥OJ——C语言】顺子日期、特殊时间、乘积尾零
2022 年 2 月 22 日 22:20 是一个很有意义的时间, 年份为 2022 , 由 3 个 2 和 1 个 0 组成, 如果将月和日写成 4 位, 为 0222 , 也是由 3 个 2 和 1 个 0 组 成, 如果将时间中的时和分写成 4 位, 还是由 3 个 2 和 1 个 0 组成。
140 0
|
Java 测试技术 C语言
【蓝桥杯基础题】2020年省赛填空题—回文日期
【蓝桥杯基础题】2020年省赛填空题—回文日期
188 0
【蓝桥杯基础题】2020年省赛填空题—回文日期
【C语言】(错题整理) 寻找完数、字符串中各类字符数的统计、最大公约数和最小公倍数、回文数计算 (循环、函数相关内容)
本篇博客旨在整理最近在头歌遇到的难题、错题,对其进行分析并整理。 一、循环 1.寻找完数(计算因子例题) 一个数如果恰好等于它的因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出1000之内的所有完数。 这道题的首要任务就是找到各个数的因子,然后再对其进行判断。那么计算这个数的因子,我们可以用循环,试每个小于它的数对其进行求余%,结果为零即是因子。
|
测试技术
PAT乙级1006.换个格式输出整数(15分)
PAT乙级1006.换个格式输出整数(15分)
54 0
|
机器学习/深度学习 算法 安全
【Python 百练成钢】时间调整、二进制数、回文素数、字母距离、CTF、Huffuman树、抽奖、前后缀最值、纯质数求解、花园灌溉
【Python 百练成钢】时间调整、二进制数、回文素数、字母距离、CTF、Huffuman树、抽奖、前后缀最值、纯质数求解、花园灌溉
187 0
【Python 百练成钢】时间调整、二进制数、回文素数、字母距离、CTF、Huffuman树、抽奖、前后缀最值、纯质数求解、花园灌溉
AcWing 655. 天数转换
AcWing 655. 天数转换
44 0
AcWing 655. 天数转换

热门文章

最新文章