蓝桥练习系统试题笔记C++——基础练习

1.闰年判断

给定一个年份,判断这一年是不是闰年。

当以下情况之一满足时,这一年是闰年:

1. 年份是4的倍数而不是100的倍数;

2. 年份是400的倍数。

其他的年份都不是闰年。

#include<stdio.h>
bool isLeap(int y)
{
    if ( (y%4==0 && y%100!=0) || y%400==0 )
    return true;
    else
    return false;
}

int main()
{
    int y;
    scanf("%d",&y);
    if(isLeap(y))
      printf("yes");
    else
    printf("no");    
}

2.01字串

对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:

00000

00001

00010

00011

00100

请按从小到大的顺序输出这32种01串。

#include<stdio.h>
int main()
{
    int a,b,c,d,e;
    for(a=0;a<=1;a++)
    {
        for(b=0;b<=1;b++)
        {
            for(c=0;c<=1;c++)
            {
                for(d=0;d<=1;d++)
                {
                    for(e=0;e<=1;e++)
                    {
                        printf("%d%d%d%d%d
",a,b,c,d,e);
                    }
                }
            }
        }
    }
    return 0;
}

3.字母图形

利用字母可以组成一些美丽的图形,下面给出了一个例子:

ABCDEFG

BABCDEF

CBABCDE

DCBABCD

EDCBABC

这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。

笔者找到的规律是以A为对称点向两边发#include<stdio.hint main()

{
    int n,m;
    char a[26][26]={0};
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        int str='A';
        for(int j=i;j<m;j++)
        {
            a[i][j]=str++;
        }
        str='A';
        for(int j=i-1;j>=0;j--)
        {
            a[i][j]=++str;
        }
    }

/*下面这个循环本来写的是单层输出,效果一样,但是蓝桥系统不通过,改双层就过了

   for(int i=0;i<n;i++)
   {
      printf("%s ",a[i]);
   }

  */

for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            printf("%c",a[i][j]);
        }
        printf("
");
    }
    return 0;
 } 

4.数列特征

给出n个数,找出这n个数的最大值,最小值,和

#include<stdio.h>
int main()
{
    int n,a[10000],sum=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        sum=sum+a[i];
    }
    int max=a[0],min=a[0];
    for(int i=1;i<n;i++)
    {
        if(a[i]>max) max=a[i];
        if(a[i]<min) min=a[i];
    }
    printf("%d
",max);
    printf("%d
",min);
    printf("%d",sum);
    return 0; 
 } 

5.查找整数

给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。

#include<stdio.h>
int main()
{
    int n,str[10000],a;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&str[i]);
    }
    scanf("%d",&a);
    int flag=0;
    for(int i=1;i<=n;i++)
    {
        if(str[i]==a)
        {
            flag=i;
            break;
        }
    }
    if(flag==0) printf("-1");
    else printf("%d",flag);
    return 0;
}

6.杨辉三角形

杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。

它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。

下面给出了杨辉三角形的前4行:
 
1
1 1
1 2 1
1 3 3 1

给出n,输出它的前n行。

基本思想:第一个循环输出行数(1 <= n <= 34)
第二个循环输出改行里的数(n行有n个数)
n>=3时,a[i][j]=a[i-1][j-1]+a[i-1][j]
n<3时,a[i][j]=1

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int a[35][35]={0};
    a[1][1]=1,a[2][1]=1,a[2][2]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            if(i==1 || i==2)
                printf("%d ",a[i][j]);
            else
            {
               a[i][j]=a[i-1][j-1]+a[i-1][j];
               printf("%d ",a[i][j]);
            }
        }
        printf("
");
    }
    return 0;
}

 7.特殊的数字

153是一个非常特殊的数,它等于它的每位数字的立方和,即
153=1*1*1+5*5*5+3*3*3。
编程求所有满足这种条件的三位十进制数。

#include<stdio.h>
int main()
{
    int g,s,b;
    for(int i=100;i<1000;i++)
    {
        g=i%10;
        s=(i/10)%10;
        b=i/100;
        if(i==g*g*g+s*s*s+b*b*b)
            printf("%d
",i);    
    }
    return 0;
 } 

8.回文数

1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。

#include<stdio.h>
int main()
{
    int g,s,b,q;
    for(int i=1000;i<10000;i++)
    {
        g=i%10;
        s=(i/10)%10;
        b=(i/100)%10;
        q=i/1000;
        if(g==q && s==b)
         printf("%d
",i);
    }
    return 0;
}

9.特殊回文数

123321是一个非常特殊的数,它从左边读和从右边读是一样的。
  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。

基本思想:for(i从10000到1000000)
{
假设i是回文数
sum=i各个位的数字之和
判断sum是否等于且i是否是回文数
是就输出
}

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=10000;i<1000000;i++)
    {
        int sum=0,ishuiwen=0,ti=i; 
        while(ti>0)
        {
            ishuiwen=ishuiwen*10+ti%10;
            sum=sum+ti%10;
            ti=ti/10;
        }
        if(sum==n && ishuiwen==i)
        {
            printf("%d
",i);
        }
    }
    return 0;
 } 

10.十进制转十六进制

十六进制数是在程序设计时经常要使用到的一种整数的表示方式。
它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。
十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
  给出一个非负整数a (0<=a<=2147483647),将它表示成十六进制的形式。

#include<stdio.h>
int main()
{
    int a,yu;
    scanf("%d",&a);
    char cun[20];
    if(a==0)
      printf("%d
",a);
    int i=0;
    while(a>0)
    {
        yu=a%16;
        a=a/16;
        if(yu==0) cun[i++]='0';
        if(yu==1) cun[i++]='1';
        if(yu==2) cun[i++]='2';
        if(yu==3) cun[i++]='3';
        if(yu==4) cun[i++]='4';
        if(yu==5) cun[i++]='5';
        if(yu==6) cun[i++]='6';
        if(yu==7) cun[i++]='7';
        if(yu==8) cun[i++]='8';
        if(yu==9) cun[i++]='9';
        if(yu==10) cun[i++]='A';
        if(yu==11) cun[i++]='B';
        if(yu==12) cun[i++]='C';
        if(yu==13) cun[i++]='D';
        if(yu==14) cun[i++]='E';
        if(yu==15) cun[i++]='F';
    }
    for(int j=i-1;j>=0;j--)
     printf("%c",cun[j]);
    printf("
");
    return 0;
}

11.十六进制转十进制

从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。

#include<stdio.h>
#include<string.h>
int main()
{
    char str[9];
    long long num=0;
    scanf("%s",&str);
    for(int i=0;i<strlen(str);i++)
    {
        if(str[i]>='0' && str[i]<='9')
          num=num*16+str[i]-'0';
        if(str[i]>='A' && str[i]<='F')
          num=num*16+str[i]-'A'+10;
    }
    printf("%lld",num);
    return 0;
 } 

12.16进制转8进制

给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

16转10转8(系统不通过,可能和数类型有关)

#include<stdio.h>
#include<string.h>
int main()
{
    int n;
    char str[11][100000];
    int sum;
    int yu;
    int ei[200000];
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%s",str[i]);
    }
    for(int i=0;i<n;i++)
    {
        sum=0;
        for(int j=0;j<strlen(str[i]);j++)
        {
            if(str[i][j]>='0' && str[i][j]<='9')
                sum=sum*16+str[i][j]-'0';
            if(str[i][j]>='A' && str[i][j]<='F')
                sum=sum*16+str[i][j]-'A'+10;
        }
        int k=0;
        while(sum!=0)
        {
            ei[k++]=sum%8;
            sum=sum/8;
        }
        for(int m=k-1;m>=0;m--)
        {
            printf("%d",ei[m]);
        }
        printf("
");
    }
    return 0;    
 } 

16转2转8(输出不符合题目要求,可添加一个二维数组过度,笔者没有耐心了,暂时不改了)

#include<stdio.h>
#include<string.h>
#include<stack>
#include<math.h>
using namespace std;
int main()
{
    int n;
    char str[100000];
    stack<int> two1;
    int two2[400000];
    stack<int> eight;
    scanf("%d",&n);
    int k=0;
    while(n!=0)
    {
        scanf("%s",str);
        for(int i=0;i<strlen(str);i++) //16进制改2进制 
        {
            int temp;
            if(str[i]>='0' && str[i]<='9')
               temp=str[i]-'0';
            if(str[i]>='A' && str[i]>='F')
               temp=str[i]-'A'+10;
               
            int flag;
            for(int j=0;j<4;j++)
            {
                flag=temp%2;
                temp=temp/2;
                two1.push(flag);
            }
            for(int m=0;m<4;m++)
            {
                two2[k++]=two1.top();
                two1.pop();
            }
        }
        
        int quan=0,sum=0;
        for(int i=k-1;i>=0;i--) //2进制转8进制 
        {
            sum+=two2[i]*pow(2,quan);
            while((quan+1)%3==0)
            {
                eight.push(sum);
                quan=-1;
                sum=0;
            }
            quan++;    
        }
        n--;
    }
    
    while(eight.empty()!=true){
        printf("%d",eight.top());
        eight.pop();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/blog-address/p/12436686.html