模拟——图形问题
细心就好,就是按特定规则输出字符。
第一题:输入一个高度h,输出一个高度为h,上底边长度为h的梯形。
思路:表示一下每一行空格的数量,两层循环输出即可。
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int h;
while(scanf("%d",&h)!=EOF){ //循环语句防止测试用例不止一组的情况
int row=h;
int col=3*h-2;
for(int i=1;i<=row;i++){
for(int j=1;j<=col;j++){
if(j<=2*row-2*i){
printf(" ");
}
else{
printf("*");
}
}
printf("\n");
}
}
return 0;
}
第二题:叠筐问题
输入一个三元组,分别是外筐尺寸n,中心花色字符,外筐花色字符。
思路:二维数组排位置,最后输出打印。
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int n;
char a;
char b;
while(scanf("%d %c %c",&n,&a,&b)){
char c[n][n];
char right;
for(int i=0;i<(n+1)/2;i++){ //第几圈
if(((n+1)/2)%2==0){
if(i%2==0){ //这一圈该是什么
right=b;
}
else{
right=a;
}
}
else{
if(i%2==0){ //这一圈该是什么
right=a;
}
else{
right=b;
}
}
for(int j=0;j<n;j++){ //把这一圈写进数组
if(j>=i && j<=n-1-i){
c[j][i]=right;
c[i][j]=right;
c[j][n-1-i]=right;
c[n-1-i][j]=right;
}
}
}
//输出数组
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
//四个角不输出
if((i==0||i==n-1)&&(j==0||j==n-1)) {
printf(" ");
}
else
printf("%c",c[i][j]);
}
printf("\n");
}
}
return 0;
}
模拟——日期问题
日期类题目需要注意的问题:
闰年判断规则:( y%4 == 0 && y%100!=0 ) || ( y%400 == 0 )
闰年2月29天,其它的28天
31天的月份是:1 3 5 7 8 10
第一题:输入年、月、日,计算该天是本年的第几天。
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int y;
int m;
int d;
while(scanf("%d %d %d",&y,&m,&d)!=EOF){
int days=0;
for(int i=1;i<m;i++){
if(i==1||i==3||i==5||i==7||i==8||i==10){
days+=31;
}
else if(i==2){
if((y%4==0 && y%100!=0)||(y%400==0)){
days+=29;
}
else
days+=28;
}
else{
days+=30;
}
}
days+=d;
printf("%d\n",days);
}
return 0;
}
第二题:给出年份m和一年中的第n天,算出第n天是几月几号,并按yyyy-mm-dd的格式打印出来
注:不足位前面补0的做法:printf("%04d-%02d-%02d\n",m,mouth,day);
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int m;
int n;
while(scanf("%d %d",&m,&n)!=EOF){
bool b=true;
int mouth=0;
int day;
while(b){
mouth++;
if(mouth==1||mouth==3||mouth==5||mouth==7||mouth==8||mouth==10){
if(n>31){
n=n-31;
}
else{
day=n;
b=false;
}
}
else if(mouth==2){
if((m%4==0&&m%100!=0)||m%400==0){
if(n>29){
n=n-29;
}
else{
day=n;
b=false;
}
}
else{
if(n>28){
n=n-28;
}
else{
day=n;
b=false;
}
}
}
else{
if(n>30){
n=n-30;
}
else{
day=n;
b=false;
}
}
}
printf("%04d-%02d-%02d\n",m,mouth,day);
}
return 0;
}
第三题:设计一个程序,能计算一个日期加上若干天后的时期是什么
输入:第一行代表样例个数m,接下来m行,每行4个整数,代表年、月、日和累加天数。
输出:输出m行,每行按yyyy-mm-dd输出
<注>:其实日期题书上都是一种做法,在前两道题中和我自己写的难易程度差不多。但这道题涉及到了可能跨年甚至跨好几年,是前两道题的结合版,这样看的话我如果还写逻辑判断就过于复杂了,因此这里记录一下书上的做法。真正要是机试遇到了,要记得还有这种做法。
#include <iostream>
#include <cstdio>
using namespace std;
int daytab[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%4==0 && year%100!=0) || (year%400==0);
}
int NumberOfYear(int year){
if(IsLeapYear(year)){
return 366;
}
else{
return 365;
}
}
int main(){
int year,month,day;
int number;
int caseNumber;
scanf("%d",&caseNumber);
while(caseNumber--){
scanf("%d %d %d %d",&year,&month,&day,&number);
//将输入日期转化为天数
int row =IsLeapYear(year);
for(int j=0;j<month;++j){
number+=daytab[row][j];
}
//加上若干天
number+=day;
//将天数转化回日期
while(number>NumberOfYear(year)){
number-=NumberOfYear(year);
year++;
}
month=0;
row=IsLeapYear(year);
while(number>daytab[row][month]){
number-=daytab[row][month];
month++;
}
day=number;
printf("%04d-%02d-%02d",year,month,day);
}
return 0;
}