蓝桥杯基础训练超全习题题解——BASIC-14~30

每日刷题(三十)

BASIC-14、时间转换

在这里插入图片描述
在这里插入图片描述
这题非常简单,这里就不做过多赘述了,详细C代码如下

#include<stdio.h>

int main()
{
	int n;
	scanf("%d", &n);
	printf("%d:%d:%d\n", n / 3600, n % 3600 / 60, n % 3600 % 60);
	return 0;
}

部分示例结果展示如下
在这里插入图片描述

在这里插入图片描述

BASIC-15、字符串对比

在这里插入图片描述
在这里插入图片描述
这个题其实给人的思路也很清晰,分四类讨论,第一个划分条件是两个字符串的长度是否相等,第二个划分条件是字符串是否相等,第三个划分条件是不考虑大小写字符串是否相等。详细C代码如下:

#include<stdio.h>
#include<string.h>
#include<math.h>

int f(char s1[], char s2[])
{
	int i, num = 0;
	for(i = 0; s1[i] != '\0'; i++)
	{
		if(abs(s1[i] - s2[i]) == 32)
			num++;
		else if(s1[i] == s2[i])
			num++;
	}
	if(num == i)
		return 1;
	else
		return 0;	
}

int main()
{
	char s1[10], s2[10];
	scanf("%s", s1);
	scanf("%s", s2);
	int c1, c2;
	c1 = strlen(s1);
	c2 = strlen(s2);
	if(c1 != c2)
		printf("1\n");
	else
	{
		if(strcmp(s1, s2) == 0)
			printf("2\n");	
		else if(f(s1, s2))
			printf("3\n");
		else
			printf("4\n");
	}
	return 0;
}

部分示例运行结果如下:
在这里插入图片描述
在这里插入图片描述

BASIC-16、分解质因数

在这里插入图片描述
在这里插入图片描述
对于这道题的题意,有一部分人可能没读懂,质因数就是这个数既是质数,同时又是组成k的乘数之一。根据样例输入可以发现一个规律,奇数的质因数绝对都是奇数,而偶数的质因数一定有2,那么就要分两种情况考虑,一种是目标数是奇数,一种是目标数是偶数,而且对于大多数数据而言,他们都有很多质因数,所以就要用变量k来装i的值,进行运算。这里还要考虑输出格式的问题,如果目标数含有两个及其以上的质因数,那么就要考虑符号的输出格式,这里我们用cnt记载有多少质因数。当只有一个时,就输出数字无须附上*,所以在奇偶条件内还要包括一层if语句,详细C代码如下:

#include<stdio.h>

int main()
{
	int n, m;
	scanf("%d %d", &n, &m);
	int i;
	int k;
	int cnt;
	for(i = n; i <= m; i++)
	{
		cnt = 0;				//质因数个数 
		printf("%d=",i);
		k = i;
		while(k != 1)
		{
			if(k % 2 == 0)		//本为偶数
			{
				
				if(cnt >= 1)
					printf("*2");
				else
					printf("2");
				k /= 2;
				cnt++; 
			} 
			else				//本为奇数 
			{
				int j;
				for(j = 3; j < m; j += 2)
				{
					if(k % j == 0)
					{
						
						if(cnt >= 1)
							printf("*%d",j);
						else
							printf("%d",j);
						k /= j;
						cnt++;
						break;
					}
				}
			}
		}
		printf("\n");
	}
}

部分示例运行结果如下:
在这里插入图片描述

BASIC-17、矩阵乘法

在这里插入图片描述
在这里插入图片描述
这个题还是很值得思考的。这里也有很多坑。
(1)要考虑幂数,如果幂为0,那么矩阵处理后就应该是单位矩阵,如果幂为1,则矩阵就是为输入的矩阵本身,当然,需要注意输出格式。
(2)要考虑如何处理已经乘完的矩阵同时又不影响乘法过程,我这里设了三个数组,a[N][N]用来继承原始数组数据,b[N][N]开始初始化时跟a数组的值一样,但之后b数组就来承接依次幂运算后的结果,c[N][N]数组用来继承每一轮矩阵乘法后的数组,等一次矩阵乘法结束后再把它的值赋给b,以便下一次矩阵运算。
(3)要考虑数组数据大小,如果数据可能超出int所能记录的范围,可以考虑全程用long long型

我这里有两款C代码,一种是普通版,一种是高阶版(用了二维指针)

普通版:

#include<stdio.h>
int N;

void f(long long a[][N], long long b[][N], long long c[][N])
{
	int i, j, t, k;
	long sum;
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			sum = 0;
			for(t = 0; t < N; t++)
			{
				sum += a[i][t] * b[t][j];
			}
			c[i][j] = sum;
		}
	}
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			b[i][j] = c[i][j];
		}
	}
}

int main()
{
	int M;
	scanf("%lld %lld", &N, &M);
	int i, j;
	long long a[N][N];
	long long b[N][N];
	long long c[N][N];
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			scanf("%lld", &a[i][j]);
			b[i][j] = a[i][j];
		}
	}
	int t;
	for(t = 1; t < M; t++)
	{
		f(a, b, c);
	}
	
	if(M > 1)
	{
		for(i = 0; i < N; i++)
		{
			for(j = 0; j < N; j++)
			{
				printf("%lld ",b[i][j]);
			}
			printf("\n"); 
		}	
	}
	else if(M == 1)
		{
			for(i = 0; i < N; i++)
			{
				for(j = 0; j < N; j++)
				{
					printf("%lld ", a[i][j]);
				}
				printf("\n"); 
			}
		}
	else if(M == 0)
		{
			for(i = 0; i < N; i++)
			{
				for(j = 0; j < N; j++)
				{
					if(i == j)
						a[i][j] = 1;
					else
						a[i][j] = 0;
					printf("%lld ", a[i][j]);
				}
				printf("\n");
			}
		}
	return 0;
} 

高阶版:

扫描二维码关注公众号,回复: 9852801 查看本文章
#include<stdio.h>
int N;

void f(int (*p)[N], int (*q)[N], int (*k)[N])
{
	int i, j, t;
	int sum;
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			sum = 0;
			for(t = 0; t < N; t++)
			{
				sum += *(*(p + i) + t) * (*(*(q + t) + j));
			}
			*(*(k + i) + j) = sum;
		}
	}
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			*(*(q + i) + j) = *(*(k + i) + j);
		}
	}
}

int main()
{
	int M;
	scanf("%d %d", &N, &M);
	int i, j;
	int a[N][N];
	int b[N][N];
	int c[N][N];
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			scanf("%d", &a[i][j]);
			b[i][j] = a[i][j];
		}
	}
	int t;
	int (*p)[N] = a;
	int (*q)[N] = b;
	int (*k)[N] = c;
	for(t = 1; t < M; t++)
	{
		f(p, q, k);
	}
	
	if(M > 1)
	{
		for(i = 0; i < N; i++)
		{
			for(j = 0; j < N; j++)
			{
				printf("%lld ",b[i][j]);
			}
			printf("\n"); 
		}	
	}
	else if(M == 1)
		{
			for(i = 0; i < N; i++)
			{
				for(j = 0; j < N; j++)
				{
					printf("%lld ", a[i][j]);
				}
				printf("\n"); 
			}
		}
	else if(M == 0)
		{
			for(i = 0; i < N; i++)
			{
				for(j = 0; j < N; j++)
				{
					if(i == j)
						a[i][j] = 1;
					else
						a[i][j] = 0;
					printf("%lld ", a[i][j]);
				}
				printf("\n");
			}
		}
	return 0;
} 

在这里插入图片描述
内存使用都一样大,第一个是高阶版,第二个是普通版的结果。

部分示例运行结果如下:
在这里插入图片描述
在这里插入图片描述

BASIC-30、阶乘计算

在这里插入图片描述
在这里插入图片描述
这个题目有点魔鬼,因为你要考虑你的数组到底设多大,你的数组能设多大。其次你得考虑数字存放的逻辑,分情况讨论,进位和未进位,同时需要设置两个变量,一个存放刚开始做乘法所产生的的进位,另一个存放前一个数乘法运算后产生的进位,每一轮循环要修改其值。

详细C代码如下:

#include<stdio.h>
//#include<string.h>

int main()
{
	int a[90000] = {0};
//	memset(a, 0, sizeof(a));
	int n;
	scanf("%d",&n);
	int i;
	a[0] = 1;
	int j = 1;
	int t = 0;
	int m = 0;
	int s = 0;
	for(j = 1; j <= n; j++)
	{ 
		t = 0;
		m = 0;
		for(i = 0; i < 90000; i++)
		{
			m = a[i] * j / 10;
			a[i] = a[i] * j % 10;
			
			if(a[i] + t >= 10)			//前一个数的进位 
			{
				s = a[i] + t;
				t = m + s / 10;
				a[i] = s % 10;
			}
			else
			{
				a[i] += t;
				t = m;
			}
		
		}
	}
	int k = 0;
	for(i = 89999; i >= 0; i--)
	{
		if(a[i] != 0)
			k = 1;
		if(k)
			printf("%d",a[i]);	
	}
		
	printf("\n");
	return 0;
} 

这里列出一部分示例以及结果:
在这里插入图片描述
在这里插入图片描述

如果喜欢我的文章,请记得三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持,下期更精彩!!!

发布了40 篇原创文章 · 获赞 7 · 访问量 3103

猜你喜欢

转载自blog.csdn.net/qq_44631615/article/details/104829840