蓝桥杯 基础练习13题C语言

第一题 闰年判断

给定一个年份,判断这一年是不是闰年。
当以下情况之一满足时,这一年是闰年:
1. 年份是4的倍数而不是100的倍数;
2. 年份是400的倍数。
其他的年份都不是闰年。
#include<stdio.h>
int main(){
   int year;
   scanf("%d",&year);
   if(year%400==0||(year%4==0&&year%100!=0)){//判断是否是闰年的条件
    printf("yes");
	 }
	else{
		printf("no");
	}
	return 0;
}

第二题 01字串

对于长度为5位的一个01串,每一位都可能是01,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这3201串。
#include<stdio.h>
int main(){
	int a,b,c,d,e;
	for(a=0;a<2;a++){
     for(b=0;b<2;b++){
        for(c=0;c<2;c++){
           for(d=0;d<2;d++){
               for(e=0;e<2;e++){
                  printf("%d%d%d%d%d",a,b,c,d,e);//循环输出32种01字串
               }
           }
        }
     }
  }
  return 0;
}

第三题 字母图形

利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个57列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
#include<stdio.h>
#include<math.h>
int main()
{
    int m,n;
    scanf("%d%d",&n,&m);
    int i,j;
    for(i=0;i<n;i++)
    {
         for(j=0;j<m;j++)
         {
              printf("%c",65+abs(i-j)); //按格式输出
         }
         printf("\n");
    } 
   return 0;
}

题目四 数列特征

给出n个数,找出这n个数的最大值,最小值,和。
#include <stdio.h>
int main(){
 int n,i,max=-10001,min=10001,sum=0;
 scanf("%d",&n);
 int a[n];
 for(i=0;i<n;i++){
    scanf("%d",&a[i]);
    if(max<a[i]){
       max=a[i];//找出最大值
    }
    if(min>a[i]){
       min=a[i];//找出最小值
    }
  sum+=a[i];//求和
 }
 printf("%d\n%d\n%d\n",max,min,sum);//按格式输出
 return 0;
} 

第五题 查找整数

给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
#include<stdio.h>
int main(){
   int n,i;
   scanf("%d",&n);
   int arr[n];
   for(i=0;i<n;i++){
       scanf("%d",&arr[i]);//循环输出n个数组元素
   }
   int z;
   scanf("%d",&z);
   for(i=0;i<n;i++){
       if(arr[i]==z){
          printf("%d",i+1);
          return 0;
       }//判断第几个数与要判断的数相等,如果相等,输出i+1,并返回0;
   }
   printf("-1");//循环结束,没有与要判断的数相等的数,输出-1;
   return 0;
}

第六题 杨辉三角形

杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
   1
  1 1
 1 2 1
1 3 3 1
给出n,输出它的前n行。
思路:利用二维数组,定位数值的位置。
     从第三行开始,中间的数为肩上数字的和,所以利用已定位的数值进行求值。
     按题目要求输出。
#include<stdio.h>
int main(){
	int N;
	scanf("%d",&N);
    int a[N][N]; 
    int i, j;
    for (i = 0; i < N; i++) {
        a[i][0] = 1;//每行第一位的数字均为1
        a[i][i] = 1;//每行最后一位的数字均为1
    }
    for (i = 2; i < N; i++){
        for (j = 1; j < i; j++)
            a[i][j] = a[i - 1][j - 1] + a[i - 1][j];/*从第三行起,计算头尾之间所有数
            计算方式为其上一行肩上两数之和*/
    }
    for (i = 0; i < N; i++) {
        for (j = 0; j < i + 1; j++)
            printf("%d ", a[i][j]);
        printf("\n");
    }//按题目要求输出
    return 0;
}

第七题 特殊的数字

153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。
#include<stdio.h>
#include<math.h>
int main(){
	int n,a,b,c;
	for(n=100;n<1000;n++){
		a=n/100;
		b=n%100/10;
		c=n%10;
		if(n==pow(a,3)+pow(b,3)+pow(c,3)){
			printf("%d\n",n);
		}
	}
	return 0;
}

第八题 回文数

1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
#include<stdio.h>
int main(){
	int n,a,b,c,d;
	for(n=1000;n<10000;n++){
		a=n/1000;
		b=n%1000/100;
		c=n%100/10;
		d=n%10;
		if(a==d&&b==c){
			printf("%d\n",n);
		}
	}
	return 0;
}

第九题 特殊回文数

123321是一个非常特殊的数,它从左边读和从右边读是一样的。
  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
思路:用数组存储回文数的每一位。
     从五位数的第一个值10000开始进行循环,直到6位数也循环结束。
     在循环中进行判断,是否为回文数,且每位数之和是否等于输入的数。
     判断方式:
     在循环中,求i的每一位数并将之放入数组中,且求和。
     判断i是几位数。
     最后判断i是否为回文数且等于输入的数,并输出结果。
#include<stdio.h>
int main(){
    int arr[10]={0},n,i,j,t,sum;
	scanf("%d",&n);
	for(i=10000;i<=999999;i++){
		t=i;
		sum=0;
		for(j=0;j<6;j++){
			arr[j]=t%10;
			t=t/10;
			sum=sum+arr[j];
		}
        if((i<=99999)&&((arr[0]==arr[4])&&(arr[1]==arr[3]))&&(sum==n)){
			printf("%d\n",i);
		}
		if((i>=100000)&&((arr[0]==arr[5])&&(arr[1]==arr[4])&&(arr[2]==arr[3]))&&(sum==n)){
			printf("%d\n",i);
		}
    }
    return 0;
}

第十题 十进制转十六进制

十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的015。十六进制的计数方法是满161,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
  给出一个非负整数,将它表示成十六进制的形式。
思路:有两种解法:
     第一种:运用C语言中各进制的进制数形式,直接转换输出。
     第二种:用数组存储转化后的十六进制数,且按照输出格式输出。
           具体操作:循环将n除以16的余数存储到数组中。
                   循环输出,将大于9的数以字符串形式输出。
           
第一种
#include<stdio.h>
int main(){
    long long n;
    scanf("%lld",&n);
    printf("%llX\n",n);
    return 0;
}
第二种
#include<stdio.h> 
#include<stdlib.h> 
int main() {
    long long n;
	int t,i=0,j;//i 用于角标的计数,j 控制 for 循环 
	int a[100];   
	scanf("%lld",&n); 
	if(n==0) printf("%d",n);
	while(n!=0) { 
		t=n;
 		n=n/16;
  	    a[i]=t%16; 
  	    i++; 
    } //循环将n除以16的余数存储到数组中
  	for(j=i-1;j>=0;j--) { 
  		if(a[j]>9&&a[j]<16) printf("%c",(a[j]-10+'A')); //大于9的数以字符串形式输出
  		else printf("%d",a[j]); 
	} 
	printf("\n"); 
	return 0;
}

第十一题 十六进制转十进制

从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
思路:有两种解法:
     第一种:运用C语言中各进制的进制数形式,直接转换输出。
     第二种:利用十六进制转十进制的运算规则进行转换。
     当输入十六进制字符串时,要将字符串转换为整型
#include<stdio.h>
int main(){
	int n;
	scanf("%X",&n);
	printf("%lld\n",n);
	return 0;
}
#include<stdio.h>
#include<string.h>
char str[8];
int main(){
	scanf("%s", str);
	long long m,i,sum = 0,k;
	m=strlen(str);
	for(k=0;k<m;k++){ 
	    if ((str[k]>='0') && (str[k]<='9')){
			i=str[k]-'0';
		}
		else i=str[k]-'A'+10;
		sum=sum*16+i;
	}
	printf("%lld", sum);
	return 0;
}

第十二题 十六进制转八进制

给定n个十六进制正整数,输出它们对应的八进制数。
思路:
先将十六进制数转化为二进制数(一位十六进制数转化为四位二进制数),再将三位二进制数转为一位八进制数,
均从后往前转换,其中,二进制转八进制,不够三位前边补零。
#include<stdio.h>
#include<string.h>
char str[100001],Two[400002],e[400002];
int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        scanf("%s",str);
        int i,len=0;
        for(i=strlen(str)-1;i>=0;i--){//十六进制转二进制
            int v,j;
            if(str[i]>='0' && str[i]<='9') v=str[i]-'0';
            else v=str[i]-'A'+10;
            for(j=0;j<4;j++){
                Two[len++]=v%2+'0';
                v/=2;
            }
        }
        Two[len]='\0';
        int x=0,cnt=1;
        int l=0;
        for(i=0;i<len;i++){//三位二进制转一位八进制,不足三位补零
            if(cnt==4||i==len-1){
                x=cnt*(Two[i]-'0')+x;
                cnt=1;
                e[l++]=x+'0';
                x=0;
            } 
			else{
                x=cnt*(Two[i]-'0')+x;
                cnt*=2;
            }
        }
        i=l-1;
        while(i>=0 && e[i]=='0') i--;//去掉前导0
        if(i<0)
            printf("0");
        for (;i>=0;i--){
            printf("%c",e[i]);
        }
        printf("\n");
    }
    return 0;
 }

第十三题 数列排序

给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
#include <stdio.h>
int main(){
	int arr[200],n,i;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d",&arr[i]);
	}
	int t,j,temp;
	for(t=1;t<n;t++)
		for(j=0;j<n-t;j++)
		if(arr[j]>arr[j+1]){
		temp=arr[j];
		arr[j]=arr[j+1];
		arr[j+1]=temp;
	}//循环多次,判断大小,使得数组中的元素按照从小到大的顺序排列
	for(i=0;i<n;i++){
		printf("%d ",arr[i]);
	}
	return 0;
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

北慕星途

谢谢土豪的赞助,一起多多加油哦

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

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

打赏作者

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

抵扣说明:

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

余额充值