图像排版
-
输出梯形
题目描述:
输出一个高度h,上底边为h的梯形
输入
一个整数h (1<= h <= 1000)
输出
h 所对应的梯形
样例输入
4
样例输出
解法思路
代码
#include <stdio.h> //需要输入输出:standard input output int main(){ int h; scanf("%d",&h); int a=2*(h-1); int b=h; for(int n=0;n<h;n++){ //控制行数 for (int i=0;i<a;i++){ //控制每行几个空格 printf(" "); } for (int j=0;j<b;j++){ //控制每行几个* printf("*"); } printf("\n"); a=a-2; b=b+2; } return 0; }
#include <stdio.h> int main(){ int h; while(scanf("%d",&h)!=EOF){ int col=h+2*(h-1); //先构造出一个矩形 int row=h; for(int i=0; i<row; ++i){ //遍历行 for(int j=0; j<col; ++j){ //遍历列 if(j<col-(h+2*i)){ // 每行先输出col-(h+2*i)个空格 printf(" "); }else{ //其余部分输出* printf("*"); } } printf("\n"); } } return 0; }
改:
#include <stdio.h> int main(){ int h; while(scanf("%d",&h)!=EOF){ int col=1+2*(h-1); int row=h; for(int i=0; i<row; ++i){ for(int j=0; j<col; ++j){ if(j<col-(1+2*i)){ printf(" "); }else{ printf("*"); } } printf("\n"); } } return 0; }
-
叠筐
题目描述:
需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
输入
输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;
输出
输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
样例输入
11 B A
5 @ W样例输出
AAAAAAAAA
ABBBBBBBBBA
ABAAAAAAABA
ABABBBBBABA
ABABAAABABA
ABABABABABA
ABABAAABABA
ABABBBBBABA
ABAAAAAAABA
ABBBBBBBBBA
AAAAAAAAA解法思路
代码
#include <stdio.h> #include <stdbool.h> //使用bool类型需要引入 char matrix[80][80]; int main(){ int n; char a,b; bool firstcase = true; while(scanf("%d %c %c",&n,&a,&b)!= EOF){ //scanf函数接收字符为 %c //如果有多组数据输出,怎样在每组之间添加一个空行 if(firstcase){ firstcase=false; //若第一次输出,将firstcase置为false }else{ printf("\n"); //若第二次输出,打印一个空行 } for(int i=0;i<=n/2;++i){ int j=n-1-i; //i+j总是等于n-1 int length=n-2*i; //当前i的矩形边长 char c; if((n/2-i)%2==0){ //观察到中心为B,外框为A;则从中心往外数,若是奇数则为B,若为偶数则为A c=a; //中心-当前:n/2 - i }else{ c=b; } for(int k=0;k<length;++k){ //为二维数组赋值 matrix[i][i+k]=c; //左上开始 matrix[i+k][i]=c; matrix[j][j-k]=c; //右下开始 matrix[j-k][j]=c; } } //四个角圆润(输出空格) if(n>1){ //长度为1时,不要需要输出空格 matrix[0][0]=' '; matrix[0][n-1]=' '; matrix[n-1][0]=' '; matrix[n-1][n-1]=' '; } //打印二维数组 for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ printf("%c",matrix[i][j]); } printf("\n"); //输出完一行,换行 } } return 0; }
日期问题
-
今年的第几天(日期A、日期B求天数)
题目描述:
输入年、月、日,计算该天是本年的第几天。
输入
包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。
输出
输入可能有多组测试数据,对于每一组测试数据,
输出一个整数,代表Input中的年、月、日对应本年的第几天。样例输入
1990 9 20
2000 5 1样例输出
263
122解法思路
出题思路——给出三个量:日期A,日期B,天数中的任意两个,求另一个
代码
#include <stdio.h> #include <stdbool.h> int daytab[2][13]={ { 0,31,28,31,30,31,30,31,31,30,31,30,31}, //平年2月28天 { 0,31,29,31,30,31,30,31,31,30,31,30,31} //闰年2月29天 }; bool isleapyear(int year){ //判断是不是闰年 return(year%4 == 0 && year%100 != 0 || year%400 == 0); } int main(){ int year,month,day; int number=0; while(scanf("%d%d%d",&year,&month,&day)!=EOF){ int row = isleapyear(year); //如果是闰年则row=1;否则row=0 for(int i=0;i<month;++i){ //逐月累加:daytab[1或0][i]自加 number += daytab[row][i]; } number += day; printf("%d",number); } return 0; }
-
打印日期(日期A、天数求日期B)
题目描述:
给出年分m和一年中的第n天,算出第n天是几月几号。
输入
输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。
输出
可能有多组测试数据,对于每组数据,
按 yyyy-mm-dd的格式将输入中对应的日期打印出来。样例输入
2000 3
2000 31
2000 40
2000 60
2000 61
2001 60样例输出
2000-01-03
2000-01-31
2000-02-09
2000-02-29
2000-03-01
2001-03-01解法思路
代码
#include <stdio.h> #include <stdbool.h> int daytab[2][13]={ { 0,31,28,31,30,31,30,31,31,30,31,30,31}, //平年2月28天 { 0,31,29,31,30,31,30,31,31,30,31,30,31} //闰年2月29天 }; bool isleapyear(int year){ //判断是不是闰年 return(year%4 == 0 && year%100 != 0 || year%400 == 0); } int main(){ int year,number; int month=0; while(scanf("%d%d",&year,&number)!=EOF){ int row = isleapyear(year); //如果是闰年则row=1;否则row=0 //计算月份 while(number>daytab[row][month]){ //天数大于当前月的天数 number -= daytab[row][month]; //逐月递减 month++; } //减剩下的就是天数 int day = number; printf("%04d-%02d-%02d\n",year,month,day); //想要输出四位数"%04d":自动补零 } return 0; }
其他模拟
-
手机键盘
题目描述:
按照手机键盘输入字母的方式,计算所花费的时间 如:a,b,c都在“1”键上,输入a只需要按一次,输入c需要连续按三次。 如果连续两个字符不在同一个按键上,则可直接按,如:ad需要按两下,kz需要按6下 ;如果连续两字符在同一个按键上,则两个按键之间需要等一段时间,如ac,在按了a之后,需要等一会儿才能按c。 现在假设每按一次需要花费一个时间段,等待时间需要花费两个时间段。 现在给出一串字符,需要计算出它所需要花费的时间。
输入
一个长度不大于100的字符串,其中只有手机按键上有的小写字母
输出
输入可能包括多组数据,对于每组数据,输出按出Input所给字符串所需要的时间
样例输入
bob
www样例输出
7
7解法思路
代码
#include <cstdio> #include <iostream> using namespace std; int keytab[26]={ 1,2,3,1,2,3,1,2,3,1,2,3,1, 2,3,1,2,3,4,1,2,3,1,2,3,4,}; //按键时间 int main(){ string str; //使用str[i]可以取到字符串中的字符 while(cin >> str){ //c++中使用cin>>str相当于之前的scanf("%d",&n)!=EOF的作用 int time = 0; for(int i=0;i<str.size();++i){ //遍历str字符串 time += keytab[str[i]-'a']; //不管连不连续都需要将按键时间累加上 //判断str中的连续两个字符,是否属于同一个数字键下 if(i!=0 && str[i]-str[i-1] == keytab[str[i]-'a']-keytab[str[i-1]-'a']){ time += 2; //若在同一个数字键下,则增加两秒的等待时间 } } printf("%d",time); } return 0; }