l蓝桥杯c语言

奇妙的数字,该数的平方和立方正好是0—9这10位数字   69

#include<stdio.h>
int count(long num)//计算位数
{
	int a=0;
	while(num>0)
	{
		a++;
		num=num/10;
	}
	return a;
}
int fun(long num,long num1)//判断是否从0-9全部用完。如果用完了 返回1,否则返回0。(num是平方,num1是立方)
{
	int b=0,c=0,d=0,e=0,numlen,num1len;
	int a[]={0,1,2,3,4,5,6,7,8,9};
	numlen=count(num);
	num1len=count(num1);
	if((numlen+num1len)!=10)return 0;//平方和立方的位数 是10位
	//排除平方里面的数字(此处的count(num)要提出到循环外,每次循环都会变化)
	for(b=0;b<numlen;b++)
	{
		d=num%10;
		num=num/10;//个位数字
		for(c=0;c<10;c++)
		{
			if(a[c]==d)
			{
				a[c]=-1;
			}
		}
	}
	//排除立方里面的数字
	for(b=0;b<num1len;b++)
	{
		d=num1%10;
		num1=num1/10;
		for(c=0;c<10;c++)
		{
			if(a[c]==d)
			{
				a[c]=-1;
			}
		}
	}
	//看有没有排除完整
	for(e=0;e<10;e++)
	{
		if(a[e]!=-1)
		{
			return 0;
		}
	}
	return 1;
}
int main()
{
	long i,j,k;
	for(i=0;i<9999;i++)
	{
		if(fun(i*i,i*i*i)==1)
		{
			printf("%d",i);
		}
	}
	return 0;
}

小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度。
为了便于比对空格,所有的空白位置都以句点符来代替。
要求输入两个整数m n,表示笔的宽度,X的高度。用空格分开(0<m<n, 3<n<1000, 保证n是奇数)
要求输出一个大X
例如,用户输入:
3 9
程序应该输出:
***.....***
.***...***.
..***.***..
...*****...
....***....
...*****...
..***.***..
.***...***.
***.....***

#include<stdio.h>
char a[2010][2010];
int main()
{
    int s,i,j,m,n;
    scanf("%d%d",&m,&n);
    s=n+m-1;
    for(i=1; i<=n; i++)
        for(j=0; j<=s; j++)
            a[i][j]='.';
    for(i=1; i<=n; i++)
        for(j=0; j<m; j++)
            a[i][j+i]=a[i][s-j-i+1]='*';
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=s; j++)
            printf("%c",a[i][j]);
        printf("\n");
    }
    return 0;
}

 煤球的数量输出 1 3 6 10 15.....求第100位数 5050

#include<stdio.h>
char a[2010][2010];
int main()
{
	int i=1,j=2,k;
	int sum=1;
	for(k=2;k<=100;k++){
		sum=j+i;
		i=j+i;
		j++;
	}
	printf("%d",sum);
}

平方怪圈:如果把一个正整数的每一位都平方后再求和,得到一个新的正整数。
对新产生的正整数再做同样的处理
如此一来,你会发现,不管开始取的是什么数字,
最终如果不是落入1,就是落入同一个循环圈。
请写出这个循环圈中最大的那个数字

图片来源于:Xiong-er的博客

#include<stdio.h>
int main()
{
	int num,count=0,max;
	int arr[50];
	scanf("%d",&num);
	for(int i=0;i<50;i++)
	{
		int sum=0,temp;
		while(num>0)
		{
			temp=num%10;
			sum=sum+temp*temp;
			num=num/10;
		}
		arr[count++]=sum;
		printf("%d ",arr[count-1]);
		num=sum;
	}
	max=arr[0];
	for(int i=1;i<count;i++)
	{
		if(max<arr[i])
		{
			max=arr[i];
		}
	}
	printf("\nmax: %d\n",max);
	return 0;
}

哈弗曼树:

Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。
  给出一列数{pi}={p0, p1, …,pn-1},用这列数构造Huffman树的过程如下:
  1. 找到{pi}中最小的两个数,设为papb,将papb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa +pb
  2. 重复步骤1,直到{pi}中只剩下一个数。
  在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。
  本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用


  例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下:
  1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5
  2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10
  3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17
  4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27
  5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59

输入

输入的第一行包含一个正整数nn<=100)。
  接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。

输出

输出用这些数构造Huffman树的总费用。

样例输入

样例输入5 5 3 8 2 9

样例输出

样例输出59
#include<stdio.h>
int count=0;
int Huffman(int arr[],int start,int end)
{
	int sum,temp,i,j;
	if(start==end)
	{
		return 0;
	}
	for(i=start;i<end;i++)
	{
		for(j=i+1;j<=end;j++)
		{
			if(arr[i]<arr[j])
			{
				temp=arr[i];
				arr[i]=arr[j];
				arr[j]=temp;
			}
		}
	}
	sum=arr[end-1]+arr[end];
	count+=sum;
	arr[end-1]+=arr[end];
	Huffman(arr,start,end-1);
}
int main()
{
	int n,i;
	int arr[1000];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&arr[i]);
	}
	Huffman(arr,0,n-1);
	printf("%d\n",count);
	return 0;
}

小明想在控制台上输出 m x n 个方格。
比如 10x4的,输出的样子是: 

#include <stdio.h>
 //打印m列,n行的方格 
void f(int m, int n)
{
	int row;
	int col;
	
	for(row=0; row<n; row++){
		for(col=0; col<m; col++) printf("+---");
		printf("+\n");
		for(col=0; col<m; col++) printf("|   ");
		printf("|\n");		
	}
	
	printf("+");
	for(col=0; col<m; col++) printf("---+");   //填空 补全代码
	printf("\n");
}
 
int main()
{
	f(10,4);
	return 0;
}

算法训练 反置数

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

样例输入

435 754

样例输出

199

#include<stdio.h>
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	int sum=0,s=0,a=0,b=0;
    while(n>0)
    {
    	if(n%10!=0)
    	{
		a=a*10+(n%10); //重点在这:0*10+(435%10)=4 确定首位 ;
    	n=n/10;
        }
        else n=n/10; //0的话就丢掉 无所谓 可减少运行时间
	}
    while(m>0)
    {
    	if(m%10!=0) //道理同上;
    	{
		b=b*10+(m%10);
    	m=m/10;
        }
        else m=m/10;
	}
	s=a+b;
    while(s>0)  
    {
		sum=sum*10+(s%10);
    	s=s/10;
	}
	
	printf("%d",sum);
	return 0;
}

 

快速排列

#include <stdio.h>
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用
void quicksort(int left,int right)
{
    int i,j,t,temp;
    if(left>right)
    return ;     
    temp=a[left]; //temp中存的就是基准数
    i=left;
    j=right;
    while(i!=j)
    {
                   //顺序很重要,要先从右边开始找
                   while(a[j]>=temp && i<j){
                   	  j--;
                   }                         
                   //再找左边的
                   while(a[i]<=temp && i<j){
                   	 i++;
                   }                           
                   //交换两个数在数组中的位置
                   if(i<j)
                   {
                            t=a[i];
                            a[i]=a[j];
                            a[j]=t;
                   }
                 
    }
    //最终将基准数归位
    a[left]=a[i];
    a[i]=temp;
    quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程
    quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程
}
int main()
{
    int i,j,t;
    //读入数据
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
    quicksort(1,n); //快速排序调用
    //输出排序后的结果
    for(i=1;i<=n;i++)
    printf("%d ",a[i]);
    return 0;
}

桶排列

#include "stdio.h"
int main(){
int m,n;
	int a[100]={0};
	scanf("%d",&m);
    int b[m+1];
	for(int i=1;i<=m;i++)
	{
	scanf("%d",&n);
	b[i]=n;
	a[n]=a[n]+1;
    }
	int max=b[1];
  
    for(int q=2;q<=m;q++){
    	if(max<b[q])
    	max=b[q];
    }
    for(int j=0;j<=max;j++)
    {
    	for(;a[j]!=0;a[j]--)
		{
		  printf("%d ",j);
    	}
    } 
    return 0;
}
   

冒泡排序:每次比较两个相邻的元素,如果他们的顺序错误就把他们交换过来

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

杨辉三角

#include<stdio.h>
int main()
{
    int i,j,k,n ;
    int a[40][40];
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
        {
            a[i][1]=1 ;
            for(j=2;j<=n;j++)
            {
                if(i==j)
                {
                    a[i][j]=1 ;
                }
                else 
                {
                    a[i][j]=a[i-1][j-1]+a[i-1][j];
                }
            }
        }
        for(i=1;i<=n;i++)
        {
        	for(k=1;k<=n-i;k++)
        	{
        		printf("  ");
			}
            for(j=1;j<i;j++)
            {
                printf("%3d ",a[i][j]);
            }
            printf("%3d",a[i][j]);
            printf("\n");
        }
        printf("\n");
    }
    return 0 ;
}
/*
......1
....1...1
..1...2...1
        1
      1   1
    1   2   1
  1   3   3   1
*/

为丰富同学们的业余文化生活,某高校学生会创办了3个兴趣小组
(以下称A组,B组,C组)。
每个小组的学生名单分别在【A.txt】,【B.txt】和【C.txt】中。
每个文件中存储的是学生的学号。
由于工作需要,我们现在想知道:
既参加了A组,又参加了B组,但是没有参加C组的同学一共有多少人?
请你统计该数字并通过浏览器提交答案 20

#include<stdio.h>

using namespace std;

int a[22*7 - 4] = {
12894792, 92774113, 59529208, 22962224, 2991600, 83340521, 87365045, 
40818286, 16400628, 39475245, 55933381, 76940287, 61366748, 95631228, 
17102313, 50682833, 61562613, 87002524, 83062019, 51743442, 61977890, 
32010762, 69680621, 87179571, 81761697, 32364296, 7833271, 36198035, 
26588918, 84046668, 43059468, 73191775, 56794101, 454780, 11141030, 
10008994, 35072237, 44945158, 53959980, 75758119, 18560273, 35801494, 
42102550, 22496415, 3981786, 34593672, 13074905, 07733442, 42374678, 
23452507, 98586743, 30771281, 17703080, 52123562, 5898131, 56698981, 
90758589, 18238802, 18217979, 4511837, 75682969, 31135682, 55379006, 
42224598, 98263070, 40228312, 28924663, 11580163, 25686441, 45944028, 
96731602, 53675990, 3854194, 14858183, 16866794, 40677007, 73141512, 
32317341, 56641725, 43123040, 15201174, 62389950, 72887083, 76860787, 
61046319, 6923746, 17874548, 46028629, 10577743, 48747364, 5328780, 
59855415, 60965266, 20592606, 14471207, 70896866, 46938647, 33575820, 
53426294, 56093931, 51326542, 94050481, 80114017, 33010503, 72971538, 
22407422, 17305672, 78974338, 93209260, 83461794, 41247821, 26118061, 
10657376, 42198057, 15338224, 50284714, 32232841, 26716521, 76048344, 
23676625, 62897700, 69296551, 59653393, 38704390, 48481614, 69782897, 
26850668, 37471053, 88720989, 51010849, 94951571, 60024611, 29808329, 
70377786, 13899299, 9683688, 58218284, 46792829, 97221709, 45286643, 
48158629, 57367208, 26903401, 76900414, 87927040, 9926730, 1508757, 
15101101, 62491840, 43802529, 
};
int b[36*7 - 2] = {
44894050, 34662733, 44141729, 92774113, 99208727, 91919833, 23727681, 
10003409, 55933381, 54443275, 13584702, 96523685, 50682833, 61562613, 
62380975, 20311684, 93200452, 23101945, 42192880, 28992561, 18460278, 
19186537, 58465301, 01111066, 62680429, 23721241, 20277631, 91708977, 
57514737, 3981786, 81541612, 07346443, 93154608, 19709455, 37446968, 
17703080, 72378958, 66200696, 30610382, 89586343, 33152171, 67040930, 
35696683, 63242065, 99948221, 96233367, 52593493, 98263070, 1418023, 
74816705, 89375940, 58405334, 96731602, 84089545, 16866794, 94737626, 
1673442, 70548494, 13638168, 8163691, 11106566, 64375392, 40267902, 
897705, 56447313, 54532235, 94738425, 66642634, 83219544, 40546096, 
66924991, 20592606, 96037590, 73434467, 70896866, 91025618, 57892091, 
8487641, 32500082, 84412833, 23311447, 38380409, 79957822, 72971538, 
69645784, 91863314, 73099909, 93209260, 83461794, 81378487, 30423273, 
22233715, 32232841, 26716521, 03511221, 29196547, 58263562, 56233305, 
52547525, 55812835, 87253244, 52484232, 80837360, 94098464, 52028151, 
53267501, 66381929, 84381316, 59788467, 9683688, 67082008, 71605255, 
80654064, 21434307, 45286643, 76556656, 82465821, 57367208, 79218980, 
48460468, 59170479, 46046391, 43043164, 96544490, 83340521, 70837892, 
18926791, 40818286, 28936302, 11489524, 51031183, 73860337, 13241219, 
9025448, 10718828, 76360986, 26031606, 76558053, 97726139, 46473415, 
48406387, 23625539, 86756012, 35164187, 49161302, 78082834, 35072237, 
8602486, 29815841, 56562216, 77684187, 81751704, 20160464, 50407962, 
27786415, 19893526, 934129, 37759498, 52636463, 25666982, 43262852, 
38393436, 2581136, 29323250, 56950657, 5898131, 95286262, 75574581, 
54057961, 6703896, 90758589, 57782642, 34492535, 41919697, 6395464, 
10993500, 81212949, 34017532, 69569396, 99009936, 57129610, 67401593, 
71044018, 62076698, 29533873, 71936325, 86874388, 26545032, 35695544, 
30433724, 53127345, 72887083, 25390873, 63711546, 6923746, 27783723, 
33199575, 35929698, 16491251, 18276792, 62744775, 92096155, 06336570, 
56141974, 73007273, 31416832, 00171057, 64176982, 46938647, 58460388, 
69972026, 73724304, 27435484, 51568616, 15531822, 47788699, 11818851, 
41594694, 83561325, 43107163, 56965375, 10557343, 26118061, 74650126, 
90076467, 10657376, 49901436, 03425162, 61164599, 15797769, 5427896, 
14444084, 36795868, 18079449, 59653393, 72942548, 06763077, 33895610, 
94892653, 12085268, 65174140, 79567366, 23020126, 74290047, 13498869, 
21696323, 27724594, 54941003, 38229841, 7050068, 
};
int c[36*7 - 2] = {
13404901, 39952424, 47847739, 94939581, 13809950, 70966043, 11161555, 
17102313, 47079425, 50682833, 74154313, 61562613, 93200452, 37103342, 
18479435, 32502597, 36198035, 54210010, 73191775, 48358178, 85544503, 
5996766, 54651623, 52113220, 27465181, 23871783, 22496415, 54107041, 
65899605, 56528700, 82671109, 61176034, 42374678, 51612628, 63329997, 
56591652, 04552733, 12789324, 89586343, 51935014, 38611966, 43916409, 
70996050, 98263070, 1418023, 65345049, 21734275, 76846198, 71506230, 
833171, 67128139, 41367555, 64769510, 44010700, 16475199, 93164325, 
9386162, 95324041, 80688223, 67629139, 79552617, 76219736, 50368644, 
45096021, 54972488, 63779011, 28862942, 73145521, 74078605, 66924991, 
12806850, 02171001, 70896866, 73434467, 8487641, 44415025, 32500082, 
84412833, 83896188, 52243759, 49191410, 38744339, 48079796, 44937032, 
06267501, 81866886, 38575984, 25978688, 78974338, 41247821, 12356966, 
64842303, 79127158, 2366944, 68000570, 12426275, 96409230, 705972, 
8266503, 83820884, 8831807, 43273308, 23216105, 29196547, 95160161, 
05553537, 52182214, 32641346, 91553427, 24436506, 77433749, 1979664, 
52028151, 88985343, 1761499, 76203088, 63237368, 23405334, 59788467, 
9683688, 67755443, 29946533, 12053603, 437479, 15200030, 45286643, 
93537527, 82465821, 57367208, 53899751, 15354933, 97760830, 68933762, 
80220545, 1892750, 39868288, 21524323, 69716610, 65083815, 78048499, 
3227391, 83340521, 87365045, 71720254, 51031183, 89168555, 8503028, 
37086236, 25103057, 87002524, 22808816, 80928090, 90741678, 15993372, 
99117082, 49938176, 21755083, 86903426, 87830263, 53959980, 75758119, 
59781354, 58679691, 25666982, 56307643, 47180521, 62776522, 78136608, 
44882734, 90758589, 8075999, 66303819, 23480347, 11580163, 87080118, 
18329165, 92514163, 89404632, 92377859, 3912329, 17499963, 59699979, 
79876366, 63894807, 37857001, 86003935, 90087123, 29433345, 80298948, 
61531153, 61046319, 37839841, 19421134, 48747364, 35196916, 62484573, 
59907079, 36845702, 21631642, 72739317, 26283700, 80114017, 76639390, 
29154110, 35159758, 47788699, 11818851, 56520669, 36396767, 36031167, 
83817428, 10657376, 90076467, 14676452, 11024560, 16327605, 76048344, 
14444084, 95452011, 99612346, 65172562, 84813675, 88618282, 38704390, 
27998014, 63859011, 33787505, 60024611, 16229880, 13899299, 35240335, 
29173227, 45036451, 66177893, 82658333, 43100730, 44520187, 74290047, 
85013538, 9926730, 27724594, 95148523, 20503000, 64390907, 26006953, 
98116293, 97457666, 29017396, 04634371, 70791589, 
};

// 已手动删去了名单中的前导 0 

int ab[22*7 - 4];

int main()
{
	int cnt1 = 0, cnt2 = 0, k = 0;
	for (int i = 0 ; i < 22*7 - 2; i ++)
	   for (int j = 0; j < 36*7 - 4; j ++)
          if(a[i] == b[j])                    // 既参加 A 又参加 B,则将该学号归入 ab 数组,同时更新计数器1 
		  {
		     ab[k ++] = a[i];
		     cnt1 ++;
		  }
	
	for (int i = 0; i < k; i ++)
	   for (int j = 0; j < 36*7 - 2; j ++)
          if(ab[i] == c[j]) cnt2 ++;          // 同时参加三个小组,更新计数器2
		  int t=cnt1 - cnt2;	     
printf("%d",t);	          // 两个计数器的值相减就是正确答案
	return 0;
}

猴子分香蕉:5只猴子是好朋友,在海边的椰子树上睡着了。这期间,有商船把一大堆香蕉忘记在沙滩上离去。
第1只猴子醒来,把香蕉均分成5堆,还剩下1个,就吃掉并把自己的一份藏起来继续睡觉。
第2只猴子醒来,重新把香蕉均分成5堆,还剩下2个,就吃掉并把自己的一份藏起来继续睡觉。
第3只猴子醒来,重新把香蕉均分成5堆,还剩下3个,就吃掉并把自己的一份藏起来继续睡觉。
第4只猴子醒来,重新把香蕉均分成5堆,还剩下4个,就吃掉并把自己的一份藏起来继续睡觉。
第5只猴子醒来,重新把香蕉均分成5堆,哈哈,正好不剩!
请计算一开始最少有多少个香蕉 3141

#include<stdio.h>
int main()
{
	int a=0,b=0,c=0,d=0;
    // 枚举香蕉的数量
    for (int x = 1; x < 10000; x ++)
	{
		if(x % 5 == 1)
		{   
			int a = (x-1)-(x-1)/5; // 第二只猴子醒来时香蕉的数量 
			if(a % 5 == 2)
			{
				int b =(a-2)-(a-2)/5; // 第三只猴子醒来时香蕉的数量 
				if(b % 5 == 3)
				{
					int c = (b-3)-(b-3)/5; // 第四只猴子醒来时香蕉的数量 
					if(c % 5 == 4)
					{
						int d = (c-4)-(c-4)/5; // 第五只猴子醒来时香蕉的数量 
						if(d % 5 == 0 && d != 0)
						{
						printf("%d",x);	break;
						}
					}
				}
	} 
	}
}
    return 0;
}

次数差:x星球有26只球队,分别用 a ~ z 的26个字母代表。他们总是不停地比赛。
在某一赛段,哪个球队获胜了,就记录下代表它的字母,这样就形成一个长长的串。
国王总是询问:获胜次数最多的和获胜次数最少的有多大差距?
(当然,他不关心那些一次也没获胜的,认为他们在怠工罢了)

#include <stdio.h>
#include <algorithm>
using namespace std;
int N = 1010;
int cnt[26];
char b[27] = {"abcdefghijklmnopqrstuvwxyz"};
int main()
{
	
    char a[N];
	scanf("%s",&a);
    for (int i = 0; i < 27; i ++)
        for (int j = 0; a[j]; j ++)           // 字符串数组以 '\0' 结尾,可用作循环结束标志
        	if(b[i] == a[j]) cnt[i] ++;
     
	 int maxn = 0, minn = 1000;   //注意max,min的赋值 
     for (int i = 0; i < 27; i ++)
	 	if(cnt[i])                           // 排除一次都没有获胜的队伍
	 	{
	 		maxn = max(maxn, cnt[i]);
 	    	minn = min(minn, cnt[i]);
	 	}
    int t=	maxn - minn;
    printf("%d",t);
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值