【上机训练】模拟类问题

图像排版

  1. 输出梯形

    题目描述:

    输出一个高度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;
    }
    
  2. 叠筐

    题目描述:

    需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。

    输入

    输入是一个个的三元组,分别是,外筐尺寸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;
    }
    

日期问题

  1. 今年的第几天(日期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;
    }
    
  2. 打印日期(日期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;
    }
    

其他模拟

  1. 手机键盘

    题目描述:

    按照手机键盘输入字母的方式,计算所花费的时间 如: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;
    }
    
    

猜你喜欢

转载自blog.csdn.net/Qmilumilu/article/details/114466090