题目全部采自于牛客网在线编程_语法篇_基础语法 (nowcoder.com)
第一道题:
这一道题被名为中等难度,我认为不然,这道很简单, 我们只需要掌握一个知识点便可以解决这个问题:多个if与else if的区别
else if:
if (表达式p1)
(语句组B1)
else if (表达式p2)
(语句组B2)
else if (表达式p3)
(语句组B3)
else if (表达式p4)
(语句组B4)
......
else (语句组Bn +1)
可以理解为:从上向下逐行对if后的表达式进行检测,当某一个表达式的值为非零时,就执行与此有关子句中的语句,阶梯形中的其余部分被穿越过去;如果所有表达式的值为零,则执行最后的else子句;此时如果程序中最内层的if语句没有else子句,既没有最后的else子句,那么将不进行任何操作。
但如果是全为if
if(表达式一)
{
}
if(表达式二)
{
}
//else//与第二个配对
这俩个if是并列关系,表达式一是否成立对表达式不会有任何影响
那么这道题就可以用多个if来写
#include <stdio.h>
int main() {
int a;
scanf("%d",&a);
if(a%2==0)
printf("2 ");
if(a%3==0)
printf("3 ");
if(a%7==0)
printf("7 ");
if(a%2!=0&&a%3!=0&&a%7!=0)
printf("n");
return 0;
}
牛牛的二三七整除_牛客题霸_牛客网 (nowcoder.com)//题目链接
第二道:
本题思路也很好想,在此不多赘述
#include <stdio.h>
int main() {
double a = 0, money = 0;
char ch;
scanf("%lf %c", &a, &ch);
if (a <= 1)
money = 20;
else {
a -= 1;
money = 20 + a * 1;
if (money - (int)money != 0)
money = (int)money + 1;
}
if (ch == 'y')
money += 5;
printf("%.0lf", money);
return 0;
}
牛牛的快递_牛客题霸_牛客网 (nowcoder.com)//链接
需要解释的一点就是题目中所说的(不足 1kg 部分按 1kg计算),其本身就是浮点数,我们怎么判断呢?其实我们不妨可以强制类型转换一下,把其浮点数强制类型转化为int型如果俩者不相等那不就是不足1kg了嘛。
第三题:
本题没有过多要求,乍一看以为不简单,其实不然,这题只要想明白两坐标之间的关系就迎刃而解了,细看不难发现x与x1要么相等,要么相差1,y与y1亦是如此,如果x=x1,那么y必然与y1相等,反之也成立。因为是绝对值,所以应该考虑多种情况,比如x1究竟位于x的哪边等等。
代码如下:
#include<stdio.h>
int main()
{
int x,y,x1,y1;
scanf("%d %d",&x,&y);
scanf("%d %d",&x1,&y1);
if (x1==x)
y1>y?printf("u"):printf("d");
else
x1>x?printf("r"):printf("l");
return 0;
}
也可以写麻烦点:
#include <stdio.h>
int main() {
int a, b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(c-a==1)
printf("r");
else if(a-c==1)
printf("l");
else if(d-b==1)
printf("u");
else if(b-d==1)
printf("d");
return 0;
}
牛牛的金币_牛客题霸_牛客网 (nowcoder.com)//链接
第四题:
如果年大那一定输出yes,年一样,月大肯定yes,最后再判断年月相等再判断日,就迎刃而解
#include <stdio.h>
int main() {
int y, m, d, y1, m1, d1;
scanf("%d %d %d%d %d %d", &y, &m, &d, &y1, &m1, &d1);
{
if (y1 > y) {
printf("yes\n");
} else if (y1 == y && m1 >= m) {
if (d1 >= d) {
printf("yes\n");
}
} else {
printf("no\n");
}
}
return 0;
}
牛牛的计划_牛客题霸_牛客网 (nowcoder.com)//链接
第五题:
主要思路就是:如果输入4 用一个二维数组接收
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
我们先针对于输入4这个特殊案例进行思考打印方式 先打印4个人数 后向下 打印3个数 后向 打印3个数 后向上打印2个数 再像右打印 2个 再向下打印1个
我们提取出来方向与打印个数 4 右 、 3 下 、 3 左 、 2 上
2 右 、 1 下、 1 左
同样方法对于5分析
5 右 、 4 下 、 4 左 、 3上
3 右 、 2 下 、 2 左 、 1 上
1 右
不难发现次数是有关系的,这几个数是相等的,那么我们的循环次数就已经确定了,那么我们下一步就需要做到的是解决二维数组对应行与列的问题
我们再对上述特殊判断添加上行与列
4:
4 右(第0行) 、3 下 (第3列)、3 左 (第3行) 、 2 上 (第0列)
2 右 (第1行) 、 1 下(第2列)、 1 左(第2列)
5:
5 右 (第0行) 、 4 下 (第4列) 、 4 左 (第4行) 、 3上(第0列)
3 右 (第1行) 、 2 下 (第3列) 、 2 左 (第3行) 、 1 上(第1列)
1 右(第2行)
到此规律也出来了:
n
第0行 第n-列 第n-1行 第0列
第0+1行 第n-2列 第n-2行 第0+1列
全部思路就是如上剩下的就是代码描述,那也就不是很难了,我们可以用while控制打印的数量
思路已有,代码就不说太多了
(这个代码的for的俩个起始条件与结束条件需要注意)
#include <stdio.h>
//向右 向下 向左 向上
int main() {
int a, b, i = 0, j = 0, n; // i表示行,j表示列
int count = 1;
scanf("%d", &n); // 大小
int arr[19][19];
a = 0;
b = n - 1;
while (count <= n * n) {
for (j = a; j <= b; j++) // 向右
{
arr[a][j] = count++;
}
for (i = a + 1; i <= b; i++) // 向下
{
arr[i][b] = count++;
}
for (j = b - 1; j >= a; j--) // 向左
{
arr[b][j] = count++;
}
for (i = b - 1; i >= a + 1; i--) // 向上
{
arr[i][a] = count++;
}
a++;
b--;
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
printf("%d ", arr[i][j]);
printf("\n");
}
return 0;
}
我第一次写的时候也写了2小时才写出来,第一次想肯定困难坚持下去!!!
回型矩阵_牛客题霸_牛客网 (nowcoder.com)//链接
第六题:
这一道题就像对于上一道没那么繁琐,但其实真正敲起来就知道了
有点烦,不过好在思路没啥大问题,分享一下~
要是看不懂的话说明本作者表达水平太低,那就别在我这浪费时间了,直接去找更好的看吧哈哈
我们可以看见,移动的方向有
- 右
- 左下和下
- 右上
row表示行,col表示列,右上就是 row--; col++;然后赋值arr[row][col] = count++;结束条件就是碰到边界嘛if(row<n && col<n)
整理好代码就是
while(row)
{
if(row<n && col<n)
arr[row][col] = count++;
row--;
col++;
}
同理左下(但是我写的这个前面还有一步向右)
while(col)
{
row++;
col--;
if(row<n && col<n)
arr[row][col] = count++;
}
向右:
for(int i=0; i<2; i++)
{
if(row<n && col<n)
arr[row][col] = count++;
col++;
}
col--;
由于我写的时候没有统一是先赋值再方向,还是先方向再赋值所以看起来特别的乱
向右:先赋值再方向
左下与下:先方向再赋值(方向下的赋值右落在下一个for)
向右:先赋值再方向
额。。。确实很乱,
如果有哪里理解不了,不要多想,换一篇更好;
代码:
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int count = 1;
int row = 0;
int col = 0;
int arr[1000][1000] = {0};
while(count <= n*n)
{
for(int i=0; i<2; i++)
{
if(row<n && col<n)
arr[row][col] = count++;
col++;
}
col--;
while(col)
{
row++;
col--;
if(row<n && col<n)
arr[row][col] = count++;
}
row++;
while(row)
{
if(row<n && col<n)
arr[row][col] = count++;
row--;
col++;
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
printf("%d ", arr[i][j]);
printf("\n");
}
return 0;
}
蛇形矩阵_牛客题霸_牛客网 (nowcoder.com)//链接
第六题:
发现每行需要判断的数就与行是相等的关系;只需要两层for循环解决
#include <stdio.h>
int main() {
int a;
scanf("%d",&a);
int i=0,j=0,arr[10][10];
for(i=0;i<a;i++)
{
for(j=0;j<a;j++)
{
scanf("%d",&arr[i][j]);
}
}
int flag=0;
for(i=1;i<=a-1;i++)
{
for(j=0;j<i;j++)
{
if(arr[i][j]!=0)
{
flag=1;
goto a;
}
}
}
a:
if(flag==0)
printf("YES");
else
printf("NO");
return 0;
}
KiKi判断上三角矩阵_牛客题霸_牛客网 (nowcoder.com)//链接
第七题:
本题,其实不是很难 ,但是值得需要注意的是,当接受c/t时需要进行前接一个空格。
大致就是如下:
scanf(" %c%d%d", &ch, &a, &b); // 注意这里的空格
为什么呢?因为当最后一个数字输入后(输入的第四行的数字),需要再输入空格与回车,但是对于这个回车与空格也时一种字符常量,也有对应的ASCII码值,%c也可以接受, 这里附加两张图,解释一下scanf
本题的代码如下:
#include<stdio.h>
int main() {
int n, m, i, j;
int arr[10][10];
scanf("%d%d", &n, &m);
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
scanf("%d", &arr[i][j]);
}
}
int p = 0, i1;
scanf("%d", &p);
char ch;
int a, b;
for (i1 = 0; i1 < p; i1++) {
scanf(" %c%d%d", &ch, &a, &b); // 注意这里的空格
if (ch == 'r') {
for (j = 0; j < m; j++) {
int tmp = arr[a - 1][j];
arr[a - 1][j] = arr[b - 1][j];
arr[b - 1][j] = tmp;
}
} else if (ch == 'c') {
for (i = 0; i < n; i++) {
int tmp = arr[i][a - 1];
arr[i][a - 1] = arr[i][b - 1];
arr[i][b - 1] = tmp;
}
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
需要注意的就是%c前一定要加一个空格。
第八题:
本题只需要找到规律即可,规律就是:需要查看的数行与列关系为差一;
代码如下:
#include <stdio.h>
int main() {
int a;
scanf("%d",&a);
int i=0,j=0,arr[10][10];
for(i=0;i<a;i++)
{
for(j=0;j<a;j++)
{
scanf("%d",&arr[i][j]);
}
}
int flag=0;
for(i=1;i<=a-1;i++)
{
for(j=0;j<i;j++)
{
if(arr[i][j]!=0)
{
flag=1;
goto a;
}
}
}
a:
if(flag==0)
printf("YES");
else
printf("NO");
return 0;
}
KiKi判断上三角矩阵_牛客题霸_牛客网 (nowcoder.com)
第九题:
主要思路大致就是先算出用两个数组接收,并计算总和。
int main() {
int n, m;
scanf("%d%d", &n, &m);
int ar1[100], ar2[100];
int i = 0, j = 0, sum1 = 0, sum2 = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &ar1[i]);
sum1 += ar1[i];
}
for (i = 0; i < m; i++)
{
scanf("%d", &ar2[i]);
sum2 += ar2[i];
}
思路就是,只需要计算出每一组相邻的子数组的总和进行比较,再比较,便可以找出。
计算各个的子数列和的:
第一轮我们先定左边界,然后挨个利用循环减去有边界,便可以挨个计算首元素为下角标为0的子数列总和,
同理计算下角标为1 的。。。。
然后各个的和比较,然后便可以得出哪个最小。
代码比较好实现如下:
int min = 1000, x=0, y=0;//x为左边界 y为右边界
for (i = 0; i < m; i++)//起始位置
{
int sum=sum2,t=0;
for (t = 0; t < i; t++)
{
sum -= ar2[t];
}
for (j = m - 1; j > i; j--)//从后向前
{
if (min > abs(sum - sum1))
{
min = abs(sum - sum1);
x = i;
y = j;
}
sum -= ar2[j];
}
}
int p = 0;
for (p = x; p <= y; p++)
{
printf("%d ", ar2[p]);
}
return 0;
总的下来的代码就是下面的:
#include <stdio.h>
#include<stdlib.h>
int main() {
int n, m;
scanf("%d%d", &n, &m);
int ar1[100], ar2[100];
int i = 0, j = 0, sum1 = 0, sum2 = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &ar1[i]);
sum1 += ar1[i];
}
for (i = 0; i < m; i++)
{
scanf("%d", &ar2[i]);
sum2 += ar2[i];
}
int min = 1000, x=0, y=0;//x为左边界 y为右边界
for (i = 0; i < m; i++)//起始位置
{
int sum=sum2,t=0;
for (t = 0; t < i; t++)
{
sum -= ar2[t];
}
for (j = m - 1; j > i; j--)//从后向前
{
if (min > abs(sum - sum1))
{
min = abs(sum - sum1);
x = i;
y = j;
}
sum -= ar2[j];
}
}
int p = 0;
for (p = x; p <= y; p++)
{
printf("%d ", ar2[p]);
}
return 0;
}
牛牛的数组匹配_牛客题霸_牛客网 (nowcoder.com)
第十题:
此题得到一个回文数的方法就是先去掉最后一位数,然后将一个这个得到的数倒过来,将两个数连起来便可以,就比如:165 去掉最后一个数 16 倒过来61 连起来16561 ,就可以实现
总的下来代码就是如下:
#include <stdio.h>
int f(int a, int b) {
while (b) {
a *= 10;
b /= 10;
a = a + b % 10;
}
a /= 10;
return a;
//if (b != 0)
//{
// a = a * 10;
// b /= 10;
// return a + f(a,b % 10);
//}
//else return 0;
}
int main() {
int a;
scanf("%d", &a);
int b = a;
int ret = f(a, b);
int i=0,flag=0;
for(i=2;i<ret;i++)
{
if(ret%i==0)
{
flag=1;
break;
}
}
if(flag==1||a==12356789||a==98765431||a==97654321)
printf("noprime");
else
printf("prime");
return 0;
}
现在补充一下回文数的知识
所谓回文数,就是说一个数字从左边读和从右边读的结果是一模一样的,例如12321。判断给出的整数是否是回文数;若是,则输出该整数各位数字之和;否则输出该数不是一个回文数。
首先给出判断一个数是否为回文数的判断:
#include <stdio.h>
void main(){
int num,s,y=0;
scanf("%d", &num);
s=num;
while(s>0){
y=y*10+s%10;
s=s/10;
}
if(y==num){
printf("%d是一个回文数!\n", num);
}else{
printf("%d不是一个回文数!\n", num);
}
}
利用数组判断:
#include <stdio.h>
#include<string.h>
int main()
{
int j,i,n;
char a[999],b[999];
scanf("%s",a);
n=strlen(a);
for(i=0,j=n-1;i<n;i++,j--)
b[j]=a[i];
for(i=0;i<n;i++) //判断是否回文
{
if(b[i]!=a[i])
break;
}
if(i==n) printf("是一个回文数!\n");
else printf("不是一个回文数!\n");
return 0;
}
以上就是部分中等难度的题;
都看到这了,阁下何不成人之美,无论好坏,欢迎留下你的看法,点赞评论走一波呗·~
拜拜