💖系列文章:C语言简单题目
💖刷题网站(题目来源):牛客网
话不多说,直接进入我们的主题👇
空心正方形图案
解题思路:打印图形问题,老朋友了。发现题目的要求规律,进行循环控制打出图案即可。比如这道题,我们可以将之看成一个矩阵(二维数组)我们需要找出第一行和最后一行,第一列和最后一列打印成*号,其他位置为空格即可解决这道题
#include <stdio.h>
int main()
{
int n = 0;
while(~scanf("%d",&n))
{
int i =0;
for(i=0;i<n;i++)
{
int j = 0;
for(j=0;j<n;j++)
{
if(i==0||i==n-1||j==0||j==n-1)
{
printf("* ");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
提交运行:
公务员面试
解题思路:注意两个重要的点:
。多组输入我们可以进行循环输入即可,注意循环终止的条件!
。我们可以假设最大的分数为0,最小的分数为100,如果当前输入的分数是大于最大的分数就赋值给它,如果小于最小的分数就赋值给它,最终我们会得到一个最大的数和一个最小的数,然后减去即可,这道题难度不大。
#include <stdio.h>
int main()
{
int score = 0;
int i = 0;
int sum = 0;
int max = 0;
int min = 100;
int count = 0;
while(scanf("%d",&score)!=EOF)
{
sum+=score;
if(score>max)
max = score;
if(score<min)
min = score;
count++;
if(count == 7)
{
printf("%.2f\n",(sum-max-min)/5.0);
count = 0;
max = 0;
min = 100;
sum = 0;
}
}
return 0;
}
提交运行:
计算日期到天数转换
解题思路:我们都知道,在一年中1,3,5,7,8,10,12月都有31天。而4,6,9,11都有30天。最关键的问题在于2月的天数我们需要去判断是否为闰年。面对这么多种情况,我们可以用switch语句来进行条件判断,同时,要统计总的天数,case情况的放置我们也要按照从大到小进行放置,使之能够进行累加进来。有了思路之后,代码就能很好实现了:
#include <stdio.h>
int main()
{
int year = 0;
int m = 0;
int day = 0;
scanf("%d %d %d",&year,&m,&day);
switch(m-1)
{
case 12: day+=31;
case 11: day+=30;
case 10: day+=31;
case 9: day+=30;
case 8: day+=31;
case 7: day+=31;
case 6: day+=30;
case 5: day+=31;
case 4: day+=30;
case 3: day+=31;
case 2:
if((year %4==0 &&year %100!=0)||year%400==0)
{
day+=29;
}
else
{
day+=28;
}
case 1: day+=31;
break;
}
printf("%d",day);
return 0;
}
提交运行:
等差数列
解题思路:等差数列首项为2,公差d=3,根据数学公式我们知道第n项为2+(n-1)*3。好了,有了这些做铺垫,我们可以用一个for循环来轻松解决这道题目。代码实现:
#include <stdio.h>
int main()
{
int n = 0;
int sum = 0;
scanf("%d",&n);
for(int i = 2;i<=(2+(n-1)*3);i+=3)
{
sum+=i;
}
printf("%d",sum);
return 0;
}
提交运行:
记负均正
解题思路:本题较为简单,我们需要记录负数的个数,以及正数和的平均值。同时要注意到输出格式的控制。代码实现:
#include <stdio.h>
int main()
{
int n= 0;
scanf("%d",&n);
int count1 = 0;
int count2=0;
float sum = 0;
int arr[2000] = {0};
for(int i = 0;i<n;i++)
{
scanf("%d",&arr[i]);
if(arr[i]<0)
{
count1++;
}
if(arr[i]>0)
{
sum+=arr[i];
count2++;
}
}
if(count2 == 0)
{
printf("%d %0.1f\n",count1,0);
return 0;
}
printf("%d %0.1f\n",count1,sum/count2);
return 0;
}
提交运行:
旋转数组的最小数字
来波遍历找最小?NONONO,不是这样的,这道题的时间复杂度是有要求的。我们需要改变一下思路,基于二分查找的思想来解决这道题目:最小值左边递增,最小值右边也递增。且左边的元素都大于右边的元素
int minNumberInRotateArray(int* arr, int arrSize)
{
int left = 0;
int right = arrSize - 1;
while(left < right)
{
int mid = (left + right) / 2;
if(arr[mid] < arr[right])
right = mid;
else if(arr[mid] > arr[right])
left = mid + 1;
else
right -=1;
}
return arr[left];
}
提交运行: