入门模拟
约 3665 字大约 12 分钟
2026-06-22
简单模拟
查找元素
图形输出
画X
点击展开题目
画X
绘制一个X(用号表示线),其中长、宽、对角线的长度(即可容纳的号个数)均为同一个奇数n。
输入描述 一个正奇数n(3≤n≤99)。
输出描述 输出一个X。注意行末不要有多余的空格。
输入样本:
3样本输出:
* *
*
* *代码长度限制[待补充] KB | 时间限制[待补充] ms | 内存限制[待补充] MB | 栈限制[待补充] KB
思路 模拟 
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
char c[N][N];
int n;
int main()
{
scanf("%d", &n);
memset(c, 0, sizeof c);
for(int i = 0; i < n; i ++)
{
int numSpace = (i < n / 2) ? (n - i) : (i + 1);
for(int j = 0; j < numSpace; j ++)
{
c[i][j] = ' ';
}
}
for(int i = 0; i < n; i ++)
{
c[i][i] = c[i][n - i - 1] = '*';
}
for(int i = 0; i < n; i ++)
{
puts(c[i]);
}
return 0;
}[待补充][待补充]日期处理
日期加法
点击展开题目
日期加法
给定一个日期DAY和一个正整数n,求日期DAY加上n天后的日期。
输入描述 第一行为给定的日期DAY(格式为YYYY - MM - DD,范围为1900 - 01 - 01$\le DAY\le $2199 - 12 - 31),数据保证一定合法;
第二行为需要增加的天数n(1≤n≤10000)。
输出描述 以YYYY - MM - DD的格式输出增加了n天后的日期。
输入样本:
2021-05-01
30样本输出:
2021-05-31代码长度限制[待补充] KB | 时间限制[待补充] ms | 内存限制[待补充] MB | 栈限制[待补充] KB
思路 通过循环逐天增加日期,在循环中根据当前年份判断是否为闰年以确定2月的天数,当日期dd超过当前月份的天数时,将日期重置为1,并更新月份mm,若月份超过12,则更新年份yyyy 。
#include <bits/stdc++.h>
using namespace std;
int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30,31,30,31};
int yyyy, mm, dd;
bool isleap(int year)
{
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
int n;
int main()
{
scanf("%d-%d-%d", &yyyy, &mm, &dd);
scanf("%d", &n);
while(n)
{
if(isleap(yyyy)) months[2] = 29;
else months[2] = 28;
if(dd < months[mm])
{
dd ++;
}
else
{
dd = 1;
if(mm < 12)
{
mm ++;
}
else
{
mm = 1;
yyyy ++;
}
}
n --;
}
printf("%04d-%02d-%02d", yyyy, mm, dd);
return 0;
}[待补充][待补充]日期减法
点击展开题目
日期减法
给定一个日期DAY和一个正整数n,求日期DAY减去n天后的日期。
输入描述 第一行为给定的日期DAY(格式为YYYY - MM - DD,范围为1900 - 01 - 01$\le DAY\le $2199 - 12 - 31),数据保证一定合法;
第二行为需要减去的天数n(1≤n≤10000)。
输出描述 以YYYY - MM - DD的格式输出减少了n天后的日期。
输入样本:
2021-05-31
30样本输出:
2021-05-01代码长度限制[待补充] KB | 时间限制[待补充] ms | 内存限制[待补充] MB | 栈限制[待补充] KB
思路 通过循环逐天减少日期,在循环中先根据当前年份判断是否为闰年,以确定2月的天数。若当前日期dd不为1,则直接减1;若dd为1,则将日期设为上一个月的最后一天,并更新月份mm,若月份为1,则更新年份yyyy ,月份设为12 。
#include <bits/stdc++.h>
using namespace std;
int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30,31,30,31};
int yyyy, mm, dd;
bool isleap(int year)
{
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
int n;
int main()
{
scanf("%d-%d-%d", &yyyy, &mm, &dd);
scanf("%d", &n);
while(n)
{
if(isleap(yyyy)) months[2] = 29;
else months[2] = 28;
if(dd != 1)
{
dd --;
}
else
{
if(mm != 1)
{
mm --;
}
else
{
mm = 12;
yyyy --;
}
dd = months[mm];
}
n --;
}
printf("%04d-%02d-%02d", yyyy, mm, dd);
return 0;
}[待补充][待补充]一年中的第几天
点击展开题目
一年中的第几天
给定一个日期,计算它是所在年份中的第几天。
输入描述 第一行为给定的日期DAY(格式为YYYY - MM - DD,范围为1900 - 01 - 01$\le DAY\le $2199 - 12 - 31),数据保证一定合法。
输出描述 输出一个整数,表示第几天。
输入样本:
2021-01-31样本输出:
31代码长度限制[待补充] KB | 时间限制[待补充] ms | 内存限制[待补充] MB | 栈限制[待补充] KB
思路 先根据年份判断是否为闰年,以确定2月的天数。然后通过循环从1月1日开始模拟日期的推进,记录经过的天数,当模拟到给定日期时,输出记录的天数,即为该日期是所在年份中的第几天。
#include <bits/stdc++.h>
using namespace std;
int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30,31,30,31};
int yyyy, mm, dd;
bool isleap(int year)
{
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
int n;
int main()
{
scanf("%d-%d-%d", &yyyy, &mm, &dd);
int m = 1, d = 0;
int cnt = 0;
if(isleap(yyyy)) months[2] = 29;
else months[2] = 28;
while(m != mm || d != dd)
{
if(d < months[m])
{
d ++;
}
else
{
d = 1;
m ++;
}
cnt ++;
}
printf("%d\n", cnt);
return 0;
}[待补充][待补充]日期先后
点击展开题目
日期先后
给定两个日期DAY1和DAY2,判断DAY1是否在DAY2之前。
输入描述 前两行分别为日期DAY1和DAY2(格式为YYYY - MM - DD,范围为1900 - 01 - 01$\le DAY\le $2199 - 12 - 31),数据保证一定合法。
输出描述 如果DAY1在DAY2之前,那么输出YES,否则输出NO。
输入样本:
2021-05-01
2021-05-07样本输出:
YES代码长度限制[待补充] KB | 时间限制[待补充] ms | 内存限制[待补充] MB | 栈限制[待补充] KB
思路 通过依次比较两个日期的年份、月份和日份来判断先后顺序。先比较年份,如果年份不同,年份小的日期在前;若年份相同,则比较月份,月份小的日期在前;若年份和月份都相同,再比较日份,日份小的日期在前。如果所有部分都相等,则DAY1不在DAY2之前。
#include <iostream>
using namespace std;
// 判断日期1是否在日期2之前
bool isBefore(int year1, int month1, int day1, int year2, int month2, int day2) {
if (year1 != year2) { // 年份不同,直接比较年份
return year1 < year2;
}
if (month1 != month2) { // 月份不同,比较月份
return month1 < month2;
}
return day1 < day2; // 年月相同,比较日份
}
int main() {
int year1, month1, day1;
int year2, month2, day2;
char dash;
cin >> year1 >> dash >> month1 >> dash >> day1; // 读取第一个日期
cin >> year2 >> dash >> month2 >> dash >> day2; // 读取第二个日期
cout << (isBefore(year1, month1, day1, year2, month2, day2) ? "YES" : "NO"); // 输出结果
return 0;
}[待补充][待补充]周几
点击展开题目
周几
给定一个日期DAY,求它是周几。
输入描述: 第一行为给定的日期DAY(格式为YYYY - MM - DD,范围为1900 - 01 - 01$\le DAY\le $2199 - 12 - 31),数据保证一定合法。
输出描述: 输出一个整数,表示周几。其中周一到周六分别用1−6表示,周天用0表示。
输入样本:
2021-05-01样本输出:
6代码长度限制[待补充] KB | 时间限制[待补充] ms | 内存限制[待补充] MB | 栈限制[待补充] KB
思路
通过将给定日期与已知周几的基准日期(如2021 - 05 - 01是周六,对应数字6)进行比较,计算两者之间相差的天数,再通过对7取模的方式得出给定日期是周几。具体实现上,判断给定日期在基准日期之前还是之后,然后通过循环逐天增加或减少日期,同时相应调整表示周几的数字。
#include<bits/stdc++.h>
using namespace std;
int months[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}
};
int yyyy, mm, dd;
int cnt = 0; // 初始化
bool isleapyear(int n)
{
return ((n % 4 == 0 && n % 100 !=0) || (n % 400 == 0));
}
bool compare(int yyyy, int mm, int dd)
{
if(yyyy != 2021) return yyyy < 2021;
if(mm != 5) return mm < 5;
return dd < 1;
}
int main()
{
scanf("%d-%d-%d", &yyyy, &mm, &dd);
if(compare(yyyy, mm, dd))
{
cnt = 0;
while(yyyy != 2021 || mm != 5 || dd != 1)
{
// 根据当前年份取当月最大天数
int maxd = months[isleapyear(yyyy)][mm];
if(dd == maxd)
{
dd = 1;
if(mm == 12)
{
mm = 1;
yyyy ++;
}
else
{
mm ++;
}
}
else
{
dd ++;
}
cnt ++;
}
// 日期在基准前面:往前推cnt天
printf("%d", (6 - cnt % 7 + 7) % 7 );
}
else
{
cnt = 0;
while(yyyy != 2021 || mm != 5 || dd != 1)
{
if(dd == 1)
{
if(mm == 1) // 修复赋值=为判断==
{
yyyy --;
mm = 12;
}
else
{
mm --;
}
// 取上一个月的天数
int maxd = months[isleapyear(yyyy)][mm];
dd = maxd;
}
else
{
dd --;
}
cnt ++;
}
// 日期在基准后面:往后推cnt天,公式修正
printf("%d", (6 + cnt) % 7 );
}
return 0;
}#include <cstdio>
int dayOfMonth[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 % 4 == 0 && year % 100 != 0);
}
void addOneDay(int &year, int &month, int &day) {
day++;
if (day > dayOfMonth[isLeapYear(year)][month]) {
month++;
day = 1;
}
if (month > 12) {
year++;
month = 1;
}
}
void subOneDay(int &year, int &month, int &day) {
day--;
if (day < 1) {
month--;
}
if (month < 1) {
year--;
month = 12;
}
if (day < 1) {
day = dayOfMonth[isLeapYear(year)][month];
}
}
bool isBefore(int year1, int month1, int day1, int year2, int month2, int day2) {
if (year1 != year2) {
return year1 < year2;
}
if (month1 != month2) {
return month1 < month2;
}
return day1 < day2;
}
bool isAfter(int year1, int month1, int day1, int year2, int month2, int day2) {
if (year1 != year2) {
return year1 > year2;
}
if (month1 != month2) {
return month1 > month2;
}
return day1 > day2;
}
int main() {
int year1 = 2021, month1 = 5, day1 = 1, dayOfWeek = 6;
int year2, month2, day2;
scanf("%d-%d-%d", &year2, &month2, &day2);
if (isBefore(year1, month1, day1, year2, month2, day2)) {
while (isBefore(year1, month1, day1, year2, month2, day2)) {
addOneDay(year1, month1, day1);
dayOfWeek = (dayOfWeek + 1) % 7;
}
} else if (isAfter(year1, month1, day1, year2, month2, day2)) {
while (isAfter(year1, month1, day1, year2, month2, day2)) {
subOneDay(year1, month1, day1);
dayOfWeek = (dayOfWeek - 1 + 7) % 7;
}
}
printf("%d", dayOfWeek);
return 0;
}[待补充][待补充]进制转换
十进制转二进制
点击展开题目 十进制转二进制
给定一个十进制数n,输出它的二进制形式。
输入描述: 一个非负整数n(0≤n≤1024)。
输出描述: 输出一个01串,表示n的二进制。
输入样本:
6样本输出:
110代码长度限制[待补充] KB | 时间限制[待补充] ms | 内存限制[待补充] MB | 栈限制[待补充] KB
思路 通过不断对十进制数n进行除2取余操作,将余数按顺序存储,最后逆序输出得到二进制数。这是利用了十进制转二进制的基本算法,即除基取余法。
#include <bits/stdc++.h>
using namespace std;
vector<int> res;
int n;
int main()
{
scanf("%d", &n);
if(n == 0) res.push_back(0);
while(n)
{
res.push_back(n % 2);
n /= 2;
}
reverse(res.begin(), res.end());
for(int i = 0; i < res.size(); i ++)
printf("%d", res[i]);
return 0;
}[待补充][待补充]二进制转十进制
点击展开题目 二进制转十进制
给定一个二进制01串,输出它的十进制形式。
输入描述: 一个二进制01串(长度不超过10)。
输出描述: 输出十进制形式。
输入样本:
110样本输出:
6代码长度限制[待补充] KB | 时间限制[待补充] ms | 内存限制[待补充] MB | 栈限制[待补充] KB
思路 从二进制数的最低位开始,依次将每一位数字乘以(2)的相应幂次(幂次从(0)开始递增),然后将所有结果累加,得到对应的十进制数,这是基于二进制转十进制的位权展开法。
#include <bits/stdc++.h>
using namespace std;
int radix2;
int radix10;
int base = 1;
int main()
{
scanf("%d", &radix2);
while(radix2)
{
radix10 += (radix2 % 10) * base;
radix2 /= 10;
base *= 2;
}
printf("%d", radix10);
return 0;
}[待补充][待补充]十进制转K进制
点击展开题目 十进制转K进制
给定一个十进制数n,输出它的K进制形式。
输入描述: 一个非负整数n(0≤n≤1024)和一个正整数K(2≤K≤16)。
输出描述: 输出一行,表示n的K进制。其中超过9的位使用大写英文字母表示(10 => A、11 => B、12 => C、13 => D、14 => E、15 => F)。
输入样本:
6 2样本输出:
110代码长度限制[待补充] KB | 时间限制[待补充] ms | 内存限制[待补充] MB | 栈限制[待补充] KB
思路 采用除基取余法,不断用十进制数n除以K,将每次的余数记录下来,这些余数就是K进制数从低位到高位的数字。由于K进制数中大于9的数字需用字母表示,所以最后遍历结果数组,将大于9的余数转换为对应的字母并输出,整体逆序输出余数序列即为所求的K进制数。
#include <bits/stdc++.h>
using namespace std;
int n, k;
vector<int> res;
int main()
{
scanf("%d%d", &n, &k);
if(n == 0) res.push_back(0);
while(n)
{
res.push_back(n % k);
n /= k;
}
reverse(res.begin(), res.end());
for(int i = 0; i < res.size(); i ++)
{
if(res[i] < 10) printf("%d", res[i]);
else printf("%c", res[i] - 10 + 'A');
}
return 0;
}[待补充][待补充]K进制转十进制
点击展开题目 K进制转十进制
给定一个K进制串,输出它的十进制形式。
输入描述: 一个K进制串(长度不超过7,其中超过9的位使用大写英文字母表示(A => 10、B => 11、C => 12、D => 13、E => 14、F => 15))和一个正整数K(2≤K≤16)。
输出描述: 输出对应的十进制形式。
输入样本:
110 2样本输出:
6代码长度限制[待补充] KB | 时间限制[待补充] ms | 内存限制[待补充] MB | 栈限制[待补充] KB
思路 从K进制串的最低位开始,依次将每一位字符转换为对应的数值(数字字符直接转换,字母字符按规则转换),然后乘以K的相应幂次(幂次从0开始递增),最后将所有结果累加,得到对应的十进制数,这是基于位权展开的方法进行K进制到十进制的转换。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
string k;
int radix;
long long res;
long long base = 1;
int main()
{
cin >> k >> radix;
for(int i = k.size() - 1; i >= 0; i --)
{
if(isalpha(k[i]))
{
res += (k[i] - 'A' + 10) * base;
base *= radix;
}
else
{
res += (k[i] - '0') * base;
base *= radix;
}
}
printf("%lld", res);
return 0;
}[待补充][待补充]