蓝桥杯练习系统习题-算法训练5

文章推荐

蓝桥杯练习系统习题-算法训练5

题目搜索方式:Ctrl+F—-> 输入题目名称—>定位到解答.

入门训练(详见 算法-蓝桥杯习题(1-1))

基础练习(详见 算法-蓝桥杯习题(2-1))

基础练习(详见 算法-蓝桥杯习题(2-2))

算法训练(详见 算法-蓝桥杯习题(3-1))

算法训练(详见 算法-蓝桥杯习题(3-2))

算法训练(详见 算法-蓝桥杯习题(3-3))

算法训练(详见 算法-蓝桥杯习题(3-4))

算法训练(详见 算法-蓝桥杯习题(3-5))

算法训练(详见 算法-蓝桥杯习题(3-6))

算法提高(详见 算法-蓝桥杯习题(4-1))

算法提高(详见 算法-蓝桥杯习题(4-2))

历届试题(详见 算法-蓝桥杯习题(5-1))

历届试题(详见 算法-蓝桥杯习题(5-2))

算法训练 输出米字形

根据输入的正整数n (1  米字形由一个(2n-1)*(2n-1)的矩阵组成,矩阵包含从大写A开始的n个字母
  例如:n=3时,包含A,B,C;n=4时,包含A,B,C,D。
  矩阵的正中间为n个字母中字典序最大的那个,从这个字母开始,沿着西北、正北、东北、正西、正东、西南、正南、东南八个方向各有一条由大写字母组成的直线。并且直线上的字母按字典序依次减小,直到大写字母A。
  矩阵的其它位置用英文句号.填充。

  样例输入一
  3

  样例输出一
  A.A.A
  .BBB.
  ABCBA
  .BBB.
  A.A.A

  样例输入二
  4

  样例输出二
  A..A..A
  .B.B.B.
  ..CCC..
  ABCDCBA
  ..CCC..
  .B.B.B.
  A..A..A

 #include <stdio.h>  
 int main()  
 {  
     int n,i,j,k,t;  
     scanf("%d",&n);  
     char a[2*n-1][2*n-1];  
     for(i=0;i<2*n-1;i++)  
     for(j=0;j<2*n-1;j++)  
     a[i][j]=0;  
     k=n;  
     for(i=0;i<n-1;i++) //行数   
     {  
         k--;  //k为字符间隔   
         t=i;  
         for(j=1;j<=3;j++)  
         {  
           a[i][t]='A'+i;  
           t+=k;  
         }  
     }  
     for(i=0;i<n;i++)    //中间一行   
     {  
         a[n-1][i]='A'+i;  
         a[n-1][2*n-2-i]='A'+i;  
     }  
     for(i=0;i<=n-2;i++)   //填补句号   
     for(j=0;j<2*n-1;j++)  
     {  
         if(a[i][j]==0)  
         a[i][j]='.';  
     }  
     for(i=0;i<=n-2;i++)    //翻转   
     for(j=0;j<2*n-1;j++)  
     a[2*n-2-i][j]=a[i][j];  
     for(i=0;i<2*n-1;i++)  
     {  
     for(j=0;j<2*n-1;j++)  
     printf("%c",a[i][j]);  
     printf("\n");   
     }  
     return 0;  
 }  

算法训练 阶乘

问题描述
  一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;而35!就更大了,它已经无法存放在一个浮点型变量中。因此,当n比较大时,去计算n!是非常困难的。幸运的是,在本题中,我们的任务不是去计算n!,而是去计算n!最右边的那个非0的数字是多少。例如,5! = 12345 = 120,因此5!最右边的那个非0的数字是2。再如:7! = 5040,因此7!最右边的那个非0的数字是4。请编写一个程序,输入一个整数n(n<=100),然后输出n! 最右边的那个非0的数字是多少。
  输入格式:输入只有一个整数n。
  输出格式:输出只有一个整数,即n! 最右边的那个非0的数字。
  输入输出样例
样例输入
6
样例输出
2

 #include<stdio.h>  
 int main(void)  
 {  
     int n;  
     int i;  
     int sum=1;  
     scanf("%d",&n);  
     for(i=n;i>=1;i--)  
     {  
         sum = sum*i;  
         while(sum%10==0)  
             sum=sum/10;  
         if(sum/100>0)  
             sum=sum%100;  
     }  
     printf("%d",sum%10);  
     return 0;  
 }  

算法训练 进制转换

问题描述
  编写一个程序,输入一个二进制的字符串(长度不超过32),然后计算出相应的十进制整数,并把它打印出来。
  输入格式:输入为一个字符串,每个字符都是’0’或’1’,字符串的长度不超过32。
  输出格式:输出一个整数。
  输入输出样例
样例输入
1101
样例输出
13

 #include <stdio.h>  
 #include <math.h>  
 #include <string.h>  
 #define MaxSize 32  
 void print2Return10(char str[])  
 {  
     long long int num=0;  
     int lenth=strlen(str),i;  
     for(i=0;i<lenth;i++)  
     {  
         if(str[i]!='0')  
         {  
             num+=pow(2,lenth-i-1);  
         }  
     }  
     printf("%lld\n",num);  
     return ;  
 }  
 main()  
 {  
     char str[MaxSize];  
     gets(str);  
     print2Return10(str);  
     return 0;  
 }  

算法训练 字串统计

问题描述
  给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
  第一行一个数字L。
  第二行是字符串S。
  L大于0,且不超过S的长度。
输出格式
  一行,题目要求的字符串。

  输入样例1:
  4
  bbaabbaaaaa

  输出样例1:
  bbaa

  输入样例2:
  2
  bbaabbaaaaa

  输出样例2:
  aa
数据规模和约定
  n<=60
  S中所有字符都是小写英文字母。

  提示
  枚举所有可能的子串,统计出现次数,找出符合条件的那个

 #include<stdio.h>  
 #include<string.h>  
 char b[60][60];  
 int c[60];  
 int main()  
 {  
     int l,i1,max=1,now=0,maxn=1,i2,weizhi=0,i3,i4,weizhi1,changdu1=-1;  
     char a[10000];  
     scanf("%d",&l);  
     getchar();  
     gets(a);  
     int n=strlen(a);  
     for(i1=n;i1>=l;i1--)//长度   
     {  
         weizhi=0;  
          for(i3=0;i3<n-i1;i3++)  
                 c[i3]=0;  
         for(i2=0;i2<n;i2++)//开始位置   
         {  
             if(i2+i1>n)   
               break;  
             int ok=1;        
             for(i3=0;i3<weizhi;i3++)//b的位置   
             {     int ko=1;  
                   for(i4=0;i4<i1;i4++)      
                    {    
                          if(b[i3][i4]!=a[i2+i4])  
                              ko=0;  
                       }  
                       if(ko)  
                         {  ok=0;  
                            c[i3]++;  
                         if(c[i3]>max)  
                            {max=c[i3];  
                             changdu1=i1;  
                             weizhi1=i2;  
                            }  
                         break;  
                      }  
             }  
             if(ok)  
             {  
                 for(i4=0;i4<i1;i4++)  
                 {  
                     b[weizhi][i4]=a[i2+i4];  
                 }  
                 c[weizhi]=1;  
                 weizhi++;  
             }  
         }  
     }  
     for(i1=weizhi1;i1<weizhi1+changdu1;i1++)  
       printf("%c",a[i1]);  
       printf("\n");  
     return 0;  
 }  

算法训练 字符删除

问题描述
  编写一个程序,先输入一个字符串str(长度不超过20),再输入单独的一个字符ch,然后程序会把字符串str当中出现的所有的ch字符都删掉,从而得到一个新的字符串str2,然后把这个字符串打印出来。
  输入格式:输入有两行,第一行是一个字符串(内部没有空格),第二行是一个字符。
  输出格式:经过处理以后的字符串。
  输入输出样例
样例输入
123-45-678


  • 样例输出
    12345678
#include <stdio.h>  
 #include <string.h>  
 #define MaxSize 20+5  
 void printResult(char str[],char ch)  
 {  
     int i;  
     for(i=0;i<strlen(str);i++)  
     {  
         if(str[i]!=ch)  
         {  
             printf("%c",str[i]);  
         }  
     }  
     printf("\n");  
 }  
 main()  
 {  
     char ch,str[MaxSize];  
     //if(scanf("%s %c",str,&ch)!=EOF)  
     if(gets(str)!=NULL)  
     {  
         scanf("%c",&ch);  
         printResult(str,ch);  
     }  
     return 0;  
 }  

算法训练 反置数

问题描述
  一个整数的“反置数”指的是把该整数的每一位数字的顺序颠倒过来所得到的另一个整数。如果一个整数的末尾是以0结尾,那么在它的反置数当中,这些0就被省略掉了。比如说,1245的反置数是5421,而1200的反置数是21。请编写一个程序,输入两个整数,然后计算这两个整数的反置数之和sum,然后再把sum的反置数打印出来。要求:由于在本题中需要多次去计算一个整数的反置数,因此必须把这部分代码抽象为一个函数的形式。
  输入格式:输入只有一行,包括两个整数,中间用空格隔开。
  输出格式:输出只有一行,即相应的结果。
  输入输出样例
样例输入
435 754
样例输出
199

 #include <stdio.h>  
 #include <math.h>  
 int getTheNumber(int num)  
 {  
     int number=1,i,j=1,flag=0;  
     if(!num)  
     return 0;  
     while(num)  
     {  
         i=num%10;  
         if(i||flag)  
         {  
             if(!flag)  
             {  
                 number=i;  
             }  
             else  
             {  
                 number=number*10+i;  
             }  
             flag=1;  
         }  
         num/=10;  
     }  
     return number;  
 }  
 main()  
 {  
     int n,m;  
     scanf("%d%d",&n,&m);  
     printf("%d\n",getTheNumber(getTheNumber(n)+getTheNumber(m)));  
     return 0;  
 }  

算法训练 新生舞会

问题描述
  新生舞会开始了。n名新生每人有三个属性:姓名、学号、性别。其中,姓名用长度不超过20的仅由大小写字母构成的字符串表示,学号用长度不超过10的仅由数字构成的字符串表示,性别用一个大写字符‘F’或‘M’表示。任意两人的姓名、学号均互不相同。换言之,每个人可被其姓名或学号唯一确定。给出m对两人的信息(姓名或学号),判断他们是否能共舞。两人能共舞的充要条件为两人性别相异。
输入格式
  第一行一个整数n(2<=n<=1000),表示学生人数。接下来的n行每行依次包含一名新生的姓名、学号、性别,分别用一个空格隔开。
  之后的一行是一个整数m(1<=m<=1000),表示询问的数目。接着的m行每行包含两个信息(姓名或学号),保证两个信息不属于同一人,中间用一个空格隔开。
输出格式
  对于每个询问输出一行,如果两人可以共舞,输出一个大写字母‘Y’,否则输出一个大写字母‘N’。
样例输入
4
John 10 M
Jack 11 M
Kate 20 F
Jim 21 M
3
John 11
20 Jack
Jim Jack
样例输出
N
Y
N

提示
可以把名字和学号都当成字符串处理。可以按以下流程实现。

 #include<iostream> 
 #include<cstring> 
 using namespace std; 
 struct tstudent 
 { 
 char name[21]; 
 char num[21]; 
 char sex; 
 }; 
 void readdata(tstudent student[], int n) 
 { 
 输入N个学生的信息 
 } 
 int findstudent(tstudent student[], int n, char* data) 
 { 
 if (data == NULL) return -1; 
 判断是否有某个学生的学号或名字等于data,如果有,函数返回该学生在student数组中的序号,否则返回-1 
 } 
 void solve(tstudent student[], int n, int m) 
 { 
 char x[21], y[21]; 
 for (int i=0; i<m; i++) { 
 输入两个人的信息X、Y。通过调用findstudent函数判断这两个人能否成为舞伴 
 } 
 } 
 int main() 
 { 
 int n, m; 
 tstudent student[1010]; 
 cin>>n; 
 readdata(student, n); 
 cin>>m; 
 solve(student, n, m); 
 } 
 #include <stdio.h>  
 #include <string.h>  
 #define MaxSize 1000+5  
 typedef struct  
 {  
     char name[21];  
     char num[21];  
     char sex;  
 }tstudent;  
 void readdata(tstudent student[], int n)  
 {  
     int i;  
     //输入N个学生的信息  
     for(i=0;i<n;i++)  
     {  
         scanf("%s %s %c",student[i].name,student[i].num,&student[i].sex);  
     }  
 }  
 int findstudent(tstudent student[], int n, char* data)  
 {  
     int i;  
     if (data == NULL)   
     {  
         return -1;  
     }  
     //判断是否有某个学生的学号或名字等于data,如果有,函数返回该学生在student数组中的序号,否则返回-  
     for(i=0;i<n;i++)  
     {  
         if(!strcmp(data,student[i].name)||!strcmp(data,student[i].num))  
         return i;  
     }  
     return -1;  
 }  
 void solve(tstudent student[], int n, int m)  
 {  
     char x[21], y[21];  
     int i,a,b;  
     for (i=0; i<m; i++)   
     {  
         //输入两个人的信息X、Y。通过调用findstudent函数判断这两个人能否成为舞伴  
         scanf("%s %s",x,y);  
         if((a=findstudent(student,n,x))!=-1&&(b=findstudent(student,n,y))!=-1)  
         {  
             if(student[a].sex!=student[b].sex)  
             printf("Y\n");  
             else  
             printf("N\n");  
         }  
         else  
         {  
             printf("N\n");  
         }  
     }  
 }  
 int main()  
 {  
     int n, m;  
     tstudent student[MaxSize];  
     scanf("%d",&n);  
     readdata(student, n);  
     scanf("%d",&m);  
     solve(student, n, m);  
     return ;  
 }  

算法训练 Hello World!

描述
  本题定义本学期作业题的输出格式,请认真阅读。
  如无特殊说明,开头无空格,间隔符为1个空格,答案最后必须输出换行符("\n")。
输入格式
  无
输出格式
  Hello World!

 #include <stdio.h>  
 main()  
 {  
     printf("Hello World!\n");  
     return 0;  
 }  

算法训练 数位分离

问题描述
  编写一个程序,输入一个1000 以内的正整数,然后把这个整数的每一位数字都分离出来,并逐一地显示。
  输入格式:输入只有一行,即一个1000以内的正整数。
  输出格式:输出只有一行,即该整数的每一位数字,之间用空格隔开。
  输入输出样例
样例输入
769
样例输出
7 6 9

 #include <stdio.h>  
 void getResult(int num)  
 {  
     //出口   
     if(num<10)  
     {  
         printf("%d ",num);  
         return ;  
     }  
     //递归   
     getResult(num/10);  
     printf("%d ",num%10);  
 }  
 main()  
 {  
     int n;  
     scanf("%d",&n);  
     getResult(n);  
     printf("\n");   
     return 0;  
 }  

算法训练 薪水计算

问题描述
  编写一个程序,计算员工的周薪。薪水的计算是以小时为单位,如果在一周的时间内,员工工作的时间不超过40 个小时,那么他/她的总收入等于工作时间乘以每小时的薪水。如果员工工作的时间在40 到50 个小时之间,那么对于前40 个小时,仍按常规方法计算;而对于剩余的超额部分,每小时的薪水按1.5 倍计算。如果员工工作的时间超过了50 个小时,那么对于前40 个小时,仍按常规方法计算;对于40~50 个小时之间的部分,每小时的薪水按1.5 倍计算;而对于超出50 个小时的部分,每小时的薪水按2 倍计算。请编写一个程序,输入员工的工作时间和每小时的薪水,然后计算并显示他/她应该得到的周薪。
  输入格式:输入只有一行,包括一个整数和一个实数,分别表示工作时间和每小时薪水。
  输出格式:输出只有一个实数,表示周薪,保留小数点后2位。
  输入输出样例
样例输入
40 50
样例输出
2000.00

 #include <stdio.h>  
 main()  
 {  
     int time;  
     float money,sum;  
     scanf("%d%f",&time,&money);  
     if(time<=40)  
     {  
         sum=time*money;  
         printf("%.2f\n",sum);  
     }  
     else  
     {  
         time-=40;  
         if(time<=10)  
         {  
             sum=time*money*1.5+40*money;  
             printf("%.2f\n",sum);  
         }  
         else  
         {  
             time-=10;  
             sum=time*money*2+10*money*1.5+40*money;  
             printf("%.2f\n",sum);  
         }  
     }  
     return 0;  
 }  

算法训练 整除问题

问题描述
  编写一个程序,输入三个正整数min、max和factor,然后对于min到max之间的每一个整数(包括min和max),如果它能被factor整除,就把它打印出来。
  输入格式:输入只有一行,包括三个整数min、max和factor。
  输出格式:输出只有一行,包括若干个整数。
  输入输出样例
样例输入
1 10 3
样例输出
3 6 9

 #include <stdio.h>  
 void getResult(int min,int max,int factor)  
 {  
     int i;  
     for(i=min;i<=max;i++)  
     {  
         if(i%factor==0)  
         {  
             printf("%d ",i);  
         }  
     }  
     printf("\n");  
     return ;  
 }  
 main()  
 {  
     int min,max,factor;  
     scanf("%d%d%d",&min,&max,&factor);  
     getResult(min,max,factor);  
     return 0;  
 }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello-java-maker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值