牛客网刷题训练(四)
👩💻博客主页:风起 风落的博客主页
✨欢迎关注🖱点赞🎀收藏⭐留言✒
👕参考网站:牛客网
💻首发时间:🎞2022年7月30日🎠
🎨你的收入跟你的不可替代成正比
🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦
💬给大家介绍一个求职刷题收割offer的地方👉点击网站
@TOC
前言
1.BC106 上三角矩阵判定
描述
KiKi想知道一个n阶方矩是否为上三角矩阵,请帮他编程判定。上三角矩阵即主对角线以下的元素都为0的矩阵,主对角线为从矩阵的左上角至右下角的连线。
输入描述:
第一行包含一个整数n,表示一个方阵包含n行n列,用空格分隔。 (1≤n≤10)
从2到n+1行,每行输入n个整数(范围-231~231-1),用空格分隔,共输入n*n个数。
输出描述:
一行,如果输入方阵是上三角矩阵输出"YES"并换行,否则输出"NO"并换行。
示例1
输入:
3
1 2 3
0 4 5
0 0 6
输出:
YES
#include<stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
int i=0;
int j=0;
int sum=1;
int sum2=0;
int arr[10][10]={0};
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&arr[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(j<i)
{
sum2+=arr[i][j];
}
}
}
if(sum2==0)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
这道题主要的意思是 :判断主对角线下的数是否为0
在这里寻找发现 在当i ,j坐标为 (1,0) (2,0) (2,1) 时恰好为0
其中每个j都小于i 将其所有相加再一起, 若为0就是, 否则就不是
2.BC98 序列中删除指定数字
描述
有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。
数据范围:序列长度和序列中的值都满足 1 \le n \le 501≤n≤50
输入描述:
第一行输入一个整数(0≤N≤50)。
第二行输入N个整数,输入用空格分隔的N个整数。
第三行输入想要进行删除的一个整数。
输出描述:
输出为一行,删除指定数字之后的序列。
示例1
输入:
6
1 2 3 4 5 9
4
输出:
1 2 3 5 9
示例2
输入:
5
1 2 3 4 6
5
输出:
1 2 3 4 6
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int N = 0;
scanf("%d", &N);
int i = 0;
int count = 0;
int arr[50] = { 0 };
for (i = 0; i < N; i++)
{
scanf("%d", &arr[i]);
}
int M = 0;
int j = 0;
scanf("%d", &M);
for (i = 0; i < N; i++)
{
if (arr[i] == M)
{
for (j = i; j < N; j++)
{
arr[j] = arr[j + 1];
}
count++;
i--;
}
}
for (i = 0; i < N - count; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
我的想法就是从头遍历 若发现删除的数字 就把后面的数字往前赋值
但是通过调试发现两点失误
1.要删除的数字不止一个 所以我用一个count记录每次发现删除数字的个数 最后遍历时再减去
2.
为什么再输出时还有一个要删除的数字4
因为这里的两个要删除的数字4是连贯的, 所以在一次把把后面的数字往前赋值时
就把i传回到之前的位置了, 而出了循环后 i是要往后走的
所以如果进入发现删除的数字, 就把后面的数字往前赋值的这个循环 就把 i 往回走一个
3.BC115 小乐乐与欧几里得
描述
小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数,但是他竟然不会求两个正整数的最大公约数与最小公倍数之和,请你帮助他解决这个问题。
输入描述:
每组输入包含两个正整数n和m。(1 ≤ n ≤ 109,1 ≤ m ≤ 109)
输出描述:
对于每组输入,输出一个正整数,为n和m的最大公约数与最小公倍数之和
示例1
输入:
10 20
输出:
30
示例2
输入:
15 20
输出:
65
#include<stdio.h>
int main()
{
long long m=0;
long long n=0;
long long r=0;
scanf("%lld%lld",&m,&n);
long p1=m;
long p2=n;
while(m%n)
{
r=m%n;
m=n;
n=r;
}
long long ret=(p1*p2)/n+n;
printf("%lld\n",ret);
return 0;
}
这里我也是报错了 一看这个预期输出的值 就是一个超级大的数
所以int时放不下的 改为long long就好了
4.BC117 小乐乐走台阶
描述
小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?
输入描述:
输入包含一个整数n (1 ≤ n ≤ 30)
输出描述:
输出一个整数,即小乐乐可以走的方法数。
示例1
输入:
2
输出:
2
示例2
输入:
10
输出:
89
#include<stdio.h>
int fib(int n)
{
if(n==1)
{
return 1;
}
if(n==2)
{
return 2;
}
return fib(n-1)+fib(n-2);
}
int main()
{
int n=0;
scanf("%d",&n);
int ret=fib(n);
printf("%d\n",ret);
return 0;
}
这道题别看是小乐乐的问题 其实就是青蛙跳台阶问题
也可以看作是斐波那契数 即 1 1 2 3 5 7 12 …
只有一个台阶时 只有一种跳法
二个台阶时, 可以 跳两个1 或者1个2 有两种跳法
三个台阶时,可以 跳3个 1 ,先1个1 后1个 2 , 先1个2后1个1 即三种跳法
所以斐波那契数的变种即 1 2 3 5 8…
正好第三种是第一种+第二种
总结
通过以上来自牛客网的练习题
相信会对学习c语言更有兴趣 ,让我们一起加油吧
不太自信的小伙伴可以看看这个训练
- 点赞
- 收藏
- 关注作者
评论(0)