C语言每日一练——day_9
引言
针对初学者,每日练习几个题,快速上手C语言。第九天。(连续更新中)
采用在线OJ的形式
什么是在线OJ?
在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用来测试参赛程序的在线系统,也可以用于平时的练习。
详细内容可以看一下这篇博客:关于C/C++语言的初学者在哪刷题,怎么刷题-CSDN博客https://blog.csdn.net/2401_88433210/article/details/146056171?spm=1011.2415.3001.10575&sharefrom=mp_manage_link
建议从第一天开始做,前面讲了的知识点后面只是会提一下。有不懂的写再评论区里
1.统计成绩
点进去直接做题:统计成绩_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/cad8d946adf64ab3b17a555d68dc0bba?tpId=107&&tqId=33368&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking参考代码:
#include <stdio.h>
int main()
{
double n;
scanf("%lf",&n);
double maxx=0,minn=1e9,average=0,sum=0;//根据题目给的范围给定一个较大的min值
for(int i=0;i<n;++i)
{
double x;
scanf("%lf",&x);//每输入一次就进行一次判断和加和
if(x>maxx)maxx=x;
if(x<minn)minn=x;
sum+=x;
}
average=sum/n;
printf("%.2f %.2f %.2f",maxx,minn,average);
return 0;
}
解析:输入的同时就最大值最小值和求和,然后计算想要的结果。
2.密码验证
点进去直接做题:密码验证_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/895b3b552d80485cb5e426a0ebf9a251?tpId=107&&tqId=33370&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking参考代码:
#include <stdio.h>
#include <string.h>
int main()
{
char s1[100] = {0};
char s2[100] = {0};
scanf("%s %s", s1, s2);
if(strcmp(s1, s2) == 0)
printf("same\n");
else
printf("different\n");
return 0;
}
解析:密码是字符串,字符串的比较函数使用strcmp函数。
3.矩阵计算
点进去直接做题:矩阵计算_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/0c83231923c541d2aa15861571831ee5?tpId=107&&tqId=33371&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking参考代码:
代码一:
#include<stdio.h>
int main()
{
int n,m,i,j;
int sum=0;
int a[10][10]={0};
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d ",&a[i][j]);
if(a[i][j]>=0)
sum+=a[i][j];
}
}
printf("%d\n",sum);
}
代码二:
#include <stdio.h>
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &m,&n);
int i = 0;
int j = 0;
int tmp = 0;
int sum = 0;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
scanf("%d", &tmp);
if(tmp > 0)
sum += tmp;
}
}
printf("%d", sum);
return 0;
}
解析: 在输入的同时,将大于0的数求和。
4.逆序输出
点进去直接做题:逆序输出_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/bb66c27cb7aa48f9ba7d9f88e4068285?tpId=107&&tqId=33373&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking参考代码:
#include <stdio.h>
int main()
{
int a[20];
for(int i = 9; i >= 0; i--)
{
scanf("%d ",&a[i]);
}
for(int i = 0; i < 10; i++)
{
printf("%d ",a[i]);
}
return 0;
}
解析:很简单,不想多说什么。
5.统计数据正负个数
点进去直接做题:统计数据正负个数_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/3f33889582934a09b4e3ddd3cc976226?tpId=107&&tqId=33374&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking参考代码:
#include <stdio.h>
int main()
{
int i = 0;
int positive = 0;
int negative = 0;
int tmp = 0;
for(i=0; i<10; i++)
{
scanf("%d", &tmp);
if(tmp>=0)
positive++;
else
negative++;
}
printf("positive:%d\n", positive);
printf("negative:%d\n", negative);
return 0;
}
解析:不想说什么,太简单了,有手就行。
6.N个数之和
点进去直接做题:N个数之和_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/b007744eb43b4f7b95d9e87de01528db?tpId=107&&tqId=33375&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking参考代码:
#include<stdio.h>
int main()
{
int n = 0;
int sum = 0;
int ret = 0;
scanf("%d",&n);
for(int i = 0;i<n;i++)
{
scanf("%d",&ret);
sum += ret;
}
printf("%d\n",sum);
return 0;
}
解析:不想说什么,太简单了,有手就行,不会的回家的。
7.最高分与最低分之差
点进去直接做题:最高分与最低分之差_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/e0e4f81dcd55408a8973f8033bbeb1d2?tpId=107&&tqId=33376&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking参考代码:
int main()
{
int n = 0;
int m = 0;
int max = 0;
int min = 100;
scanf("%d",&n);
for(int i = 0;i<n;i++)
{
scanf("%d", &m);
if(m>max)
{
max = m;
}
if(m<min)
{
min = m;
}
}
printf("%d",max-min);
return 0;
}
解析:学以致用,用前面学过的一个得最大值最小值的技巧。
8.有序序列判断
点进去直接做题:有序序列判断_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/22e87f8a8d764a6582710f38d1b40c6e?tpId=107&&tqId=33377&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking参考代码:
#include <stdio.h>
int main()
{
int n = 0;
int arr[50] = {0};
scanf("%d", &n);
int i = 0;
int flag1 = 0;
int flag2 = 0;
for(i=0; i<n; i++)
{
scanf("%d", &arr[i]);
if(i>0)
{
if(arr[i]>arr[i-1])
flag1 = 1;
else if(arr[i]<arr[i-1])
flag2 = 1;
}
}
//flag1 和 flag2 都为1是乱序的
if(flag1+flag2 > 1)
printf("unsorted\n");
else
printf("sorted\n");
return 0;
}
解析:
题目中设置2个标记变量,flag1,flag2,满足相邻2个元素升序把flag1设置为1,满足相邻2个元 素降序把flag2设置为1.如果flag1和flag2都是1,那就是乱序。 (很巧妙的技巧)
编程就是要有创新精神。
9.序列中删除指定数字
点进去直接做题:序列中删除指定数字_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/7bbcdd2177a445a9b66da79512b32dd7?tpId=107&&tqId=33379&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking参考代码:
#include <stdio.h>
int main()
{
int n = 0;
int arr[50] = {0};
int m = 0;
//输入数据
scanf("%d", &n);
int i = 0;
int j = 0;
for(i=0; i<n; i++)
{
scanf("%d", &arr[i]);
}
scanf("%d", &m);
for(i=0; i<n; i++)
{
if(arr[i] != m)
{
arr[j++] = arr[i];
}
}
for(i=0; i<j; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
解析:把代码模拟一遍就可以看懂了
要考虑删除多个相同的数字。
10.序列中整数去重
点进去直接做题:序列中整数去重_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/6564a2f6e70f4153ad1ffd58b2b28490?tpId=107&&tqId=33380&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking参考代码:
#include <stdio.h>
int main()
{
int n = 0;
int arr[5000] = {0};
//输入数据
scanf("%d", &n);
int i = 0;
for(i=0; i<n; i++)
{
scanf("%d", &arr[i]);
}
//去重
for(i=0; i<n; i++)
{
int j = 0;
for(j=i+1; j<n; j++)
{
//先找出相同的元素
//如果相等,要把后续元素往前移动
if(arr[i] == arr[j])
{
int k = 0;
for(k=j; k<n-1; k++)
{
arr[k] = arr[k+1];
}
n--;//去重一个,个数少1
j--;
//如果去重了arr[j]
//把下一个位置的数字arr[j+1],放在新的arr[j]上
//恰好又和arr[i]相同,所以也要再判断
//3 2 3 3 3 4 5
}
}
}
for(i=0;i<n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
解析:看着代码多思考,多想。
11.有序序列合并
点进去直接做题:有序序列合并_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/a9e943b0dab142759807d0cfb6863897?tpId=107&&tqId=33381&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking参考代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
代码一:
int main() {
int a, b;
int arr1[1010], arr2[1010], arr3[2020];
scanf("%d %d",&a,&b);
for(int i = 0; i < a; i++) scanf("%d ",&arr1[i]);
for(int i = 0; i < b; i++) scanf("%d ",&arr2[i]);
int t1 = 0, t2 = 0, t = 0;
while(t1 < a && t2 < b)
{
if(arr1[t1] > arr2[t2])
{
arr3[t++] = arr2[t2++];
}else
{
arr3[t++] = arr1[t1++];
}
}
while(t1 < a) arr3[t++] = arr1[t1++];
while(t2 < b) arr3[t++] = arr2[t2++];
for(int i = 0; i < a + b; i++)
{
printf("%d ",arr3[i]);
}
return 0;
}
代码二:
#include<stdio.h>
int n, m; int a[2020], b[1010];
int main()
{
scanf("%d %d", &n, &m);
int t = n + m, t1 = n, t2 = m;
for (int i = 1; i <= n; i++) scanf("%d ", &a[i]);
for (int i = 1; i <= m; i++) scanf("%d ", &b[i]);
while ( t1 >= 1 && t2 >= 1)
{
if (a[t1] > b[t2]) a[t--] = a[t1--];
else a[t--] = b[t2--];
}
while (t2 >= 1) a[t--] = b[t2--];
for (int i = 1; i <= n + m; i++) printf("%d ", a[i]);
return 0;
}
解析:
代码一:通过一个辅助数组来存数据,最后使两个数组和并成一个数组使其有序。
代码二:在一个数组上做处理,很巧妙,多看代码多悟。
做题时,一定要在脑子中有画面,多想象。