蓝桥杯基础练习(二)

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

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

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

1

1 1

1 2 1

1 3 3 1

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

输入格式
输入包含一个数n。

输出格式
输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。
样例输入
4
样例输出
1
1 1
1 2 1
1 3 3 1
数据规模与约定
1 <= n <= 34。

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

2.特殊的数字
问题描述
  153是一个非常特殊的数,它等于它的每位数字的立方和,即153=111+555+333。编程求所有满足这种条件的三位十进制数。
输出格式
  按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。

#include <stdio.h>
int main()
{
	int i,j,k;
	for(i=1;i<=9;i++)
	{
		for(j=0;j<=9;j++)
		{
			for(k=0;k<=9;k++)
			{
				if(i*i*i+j*j*j+k*k*k==100*i+10*j+k)
				{
					printf("%d%d%d\n",i,j,k);
				}
			}
		}
	}
	return 0;
}

3.回文数
问题描述
  1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
输出格式
  按从小到大的顺序输出满足条件的四位十进制数。

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

4.特殊回文数
问题描述
  123321是一个非常特殊的数,它从左边读和从右边读是一样的。
  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
  输入一行,包含一个正整数n。
输出格式
  按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
  1<=n<=54。

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

5.十进制转十六进制
问题描述
  十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有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
输出格式
  输出这个整数的16进制表示
样例输入
30
样例输出
1E

#include <stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	printf("%X",n);//%X和%x都表示十六进制
	return 0;
}

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

#include <stdio.h>
#include <math.h>
int main()
{
    int i;
    int len = 0;        //计算SUM长度
    char SUM[50];       //存储结果
    double index = 0;   //16的多少次幂
    long long sum = 0;  //结果
    int s_n = 0;        //计算十六进制数组长度
    double sixteen_1[8];//将输入的字符串数组转换成实数存入其中
    char sixteen[8];    //输入的字符串数组
    scanf("%s",sixteen);
    for(i = 0; i < 8; i++)
    {
        switch(sixteen[i])
        {
        case '0':
            sixteen_1[s_n++] = 0;
            break;
        case '1':
            sixteen_1[s_n++] = 1;
            break;
        case '2':
            sixteen_1[s_n++] = 2;
            break;
        case '3':
            sixteen_1[s_n++] = 3;
            break;
        case '4':
            sixteen_1[s_n++] = 4;
            break;
        case '5':
            sixteen_1[s_n++] = 5;
            break;
        case '6':
            sixteen_1[s_n++] = 6;
            break;
        case '7':
            sixteen_1[s_n++] = 7;
            break;
        case '8':
            sixteen_1[s_n++] = 8;
            break;
        case '9':
            sixteen_1[s_n++] = 9;
            break;
        case 'A':
            sixteen_1[s_n++] = 10;
            break;
        case 'B':
            sixteen_1[s_n++] = 11;
            break;
        case 'C':
            sixteen_1[s_n++] = 12;
            break;
        case 'D':
            sixteen_1[s_n++] = 13;
            break;
        case 'E':
            sixteen_1[s_n++] = 14;
            break;
        case 'F':
            sixteen_1[s_n++] = 15;
            break;
        }
    }
    index = (double)s_n;
    for(i = 0; i < s_n; i++)
    {
        sum += sixteen_1[i] * pow(16,index - 1);
        index--;
    }
    if(sum == 0)
    {
        SUM[len++] = '0';
    }
    else
    {
        for(; sum > 0; )
        {
            SUM[len++] = sum % 10 + '0';
            sum /= 10;
        }
    }
    for(i = len - 1; i >= 0; i--)
    {
        printf("%c",SUM[i]);
    }
    return 0;
}

7.十六进制转八进制
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

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

【注意】
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100000
int main()
{
    int n;        //十六进制数数量
    int i,j,k;    //计数变量
    int result;
    int str_len;
    scanf("%d",&n);
    char str[n][MAX_SIZE];
    /* 建立数组,保存16个十六进制数对应的二进制数 */
    char demo[16][4] = {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
    memset(str,0,n*MAX_SIZE);    //将str初始化为0
    for(i=0;i<n;i++){
        scanf("%s",str[i]);
        k = 0;
        str_len = strlen(str[i]);    //计算十六进制数长度
        int ss = 4*str_len%3;        //判断转换后的二进制数数量是否为3的倍数,如果不是,则需要补0
        char temp[4*str_len+3-ss];
        memset(temp,0,4*str_len+3-ss);
        if( ss == 1){
            strcat(temp,"00");
            k += 2;
        }
        if( ss == 2){
            strcat(temp,"0");
            k += 1;
        }
        /* 进行十六进制向二进制数的转换  */
        for(j=0;j<str_len;j++)
        {
            if(str[i][j]<65){
                temp[k++] = demo[str[i][j]-48][0];
                temp[k++] = demo[str[i][j]-48][1];
                temp[k++] = demo[str[i][j]-48][2];
                temp[k++] = demo[str[i][j]-48][3];
            }
            else if(str[i][j]>=65){
                temp[k++] = demo[str[i][j]-55][0];
                temp[k++] = demo[str[i][j]-55][1];
                temp[k++] = demo[str[i][j]-55][2];
                temp[k++] = demo[str[i][j]-55][3];
            }
        }
        temp[k] = 0;
        /* 进行输出操作 */
        for(j=0;j<4*str_len;j+=3)
        {
            if(j==0){
                result=(4*(temp[j]-48) + 2*(temp[j+1]-48) + (temp[j+2]-48));
                if( result != 0)
                printf("%d",result);
            }
            else{
            result=(4*(temp[j]-48) + 2*(temp[j+1]-48) + (temp[j+2]-48));
            printf("%d",result);
            }
        }
        printf("\n");
    }
    return 0;
}

8.数列排序
问题描述
  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
输入格式
  第一行为一个整数n。
  第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
输出格式
  输出一行,按从小到大的顺序输出排序后的数列。
样例输入
5
8 3 6 4 9
样例输出
3 4 6 8 9

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

6.7题没搞懂,下来再看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值