算法日志——第一天

141 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天

一、打印从1到最大的n位数

1.题目描述

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

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

题目地址:JZ17 打印从1到最大的n位数 在这里插入图片描述

2.代码实现

 @param n int整型 最大位数
 @return int整型一维数组
 @return int* returnSize 返回数组行数
 static int arr[100000];//全局变量加static,防止重复定义
int* printNumbers(int n, int* returnSize ) {   
    int max=0;
    while(n)
    {
        max=max*10+9;
        n--;
    }
    *returnSize=max;
    for(int i=1;i<=max;i++)
    {
        arr[i-1]=i;
    }
    return arr;
}

二、计算日期到天数转换

1.题目描述

根据输入的日期,计算是这一年的第几天。 保证年份为4位数且日期合法。 输入描述: 输入一行,每行空格分割,分别是年,月,日 输出描述: 输出是这一年的第几天

题目地址:HJ73 计算日期到天数转换 在这里插入图片描述 在这里插入图片描述

2.解题思路

在进行转换时,应该先判断下是否为闰年,因为闰年和其他年份2月的天数不一样,这是容易出错的点,其他暴力计算就行。

3.代码实现

#include<stdio.h>
int main()
{
    int y,m,d;
    scanf("%d %d %d",&y,&m,&d);
    int flag=0;//判断是否为闰年的标志
    if(y%400==0||(y%4==0&&y%100!=0))//判断
    {
        flag=1;
    }
    int arr[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    if(flag==1)
    {
        arr[1]=29;
      
    }
       int i=0;
    int sum=0;
    for(i=0;i<m-1;i++)
    {
        sum+=arr[i];
    }
    sum+=d;
    printf("%d",sum);
    return 0;
}

三、尼科彻斯定理

1.题目描述

验证尼科彻斯定理,即:任何一个整数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

题目地址:HJ76 尼科彻斯定理 在这里插入图片描述

2.解题思路

解题的关键是要确定m个连续的数的第一位,只要第一位确定了,剩下的顺利推就可,暴力求解也能解出来,但不满足时间复杂度和空间复杂度的要求,这里涉及到一点基础数学:任何一个整数n的立方写成n个连续奇数之和的第一项为:n*n-(n-1)

3.代码实现

#include<stdio.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    int i=1;
    int j=0;
    for(i=n*n-(n-1);;i+=2)
    {        
        j++;
        printf("%d",i);       
          if(j==n)
            break;
            printf("+");
    }
   return 0;
}

四、等差数列

1.题目描述

等差数列 2,5,8,11,14。。。。 (从 2 开始的 3 为公差的等差数列) 输出求等差数列前n项和 数据范围: 1≤n≤1000 输入描述: 输入一个正整数n。 输出描述: 输出一个相加后的整数。

题目地址:HJ100 等差数列 在这里插入图片描述 在这里插入图片描述

2.解题思路

在这里我们提供两种思路,第一种穷举出等差数列的每一项然后累加,第二种使用等差数列求和公式直接求和。

3.方法1

#include<stdio.h>
int main()
{
    int n=0;
    while(~scanf("%d",&n))
    {
         int sum=0;
        int s=2;
        while(n--)
        {
             sum+=s;
            s+=3;
        }
        printf("%d\n",sum);
    }
    return 0;
}

4.方法2

#include<stdio.h>
int main()
{
    int n=0;
    while(~scanf("%d",&n))
    {
         int sum=0;
         sum=n*2+n*(n-1)*3/2;
        printf("%d\n",sum);
    }
    return 0;
}