@TOC
一、打印从1到最大的n位数
1.题目描述
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
- 用返回一个整数列表来代替打印
- 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;
}