本文作者:大家好,我是原始豌豆,欢迎来到牛客网刷题解析第二期,感谢你阅读本文欢迎评论,收藏,点赞哦。
内容专栏:这里是《牛客网在线编程》专栏,笔者用重金(时间和精力)打造,每道题目提供多种解法,从基础到拓展,希望可以帮到读者们。
写作不易:本文对每道题目提供了多种解法并加上了详细的注释,意在帮助读者锻炼思维灵活性,提高分析、解决问题的能力)。
牛客网刷题解析第三期请点这里
开端
在这篇文章中,我将分享刷题过程中的一些感悟、技巧和策略。我会详细解析173道语法题,通过实例来展示如何理解和运用C语言的语法规则。同时,我也会分享一些个人的学习心得和经验,希望能帮助到同样热爱编程的你。
题目目录
牛客网语法篇基础语法16-30题(C语言实现)
题目网址链接请点这✌️
标注*符号的题目为重点题目
本页目录跳转请点下方
BC16 十六进制转十进制*
BC17 缩短二进制
BC18 牛牛的空格分隔
BC19 牛牛的对齐
BC20 进制A + B
BC21 牛牛学加法
BC22 牛牛学除法
BC23 牛牛学取余
BC24 浮点数的个位数字*
BC25 牛牛买电影票
BC26 计算带余除法
BC27 整数的个位
BC28 整数的十位
BC29 开学?*
BC30 时间转换
解法一
直接利用打印十进制的%d格式符打印16进制数,会自动转换为10进制
#include
int main() {
int num = 0xABCDEF;
printf("%15d", num);// 在%和格式字符之间插入一个整型常数来指定输出的宽度n。//不足用空格补齐,右对齐
return 0;
}
解法二
用数学上进制转换的方法
#include
#include
int main() {
int j = 0; int k = 0;//j控制16进制的权值从右向左是从零开始的。
int num[6] = { 0xA, 0xB, 0xC, 0xD, 0xE,0xF };
for (int i = 5; i >= 0; i--) {
num[i] *= (int)pow(16, j++);
k = k + num[i];//k用于累加每位转换后对应的十进制数字
}
printf("%15d", k);
return 0;
}
//补充知识:
// o 以八进制形式输出无符号整数(不输出前缀O)
// x 以十六进制形式输出无符号整数(不输出前缀Ox)
// X 以十六进制形式输出无符号整数(不输出前缀OX)(大写)
//使用修饰符“#”控制前导显示:
// # 对c,s,d,u类无影响;对o类, 在输出时加前缀0。对x类,在输出时加前缀0x;
//注意:题目要求,十六进制,字母大写,所以,,,,,,对X类,在输出时加前缀0X。
#include
int main()
{
int a = 1234;
printf("%#o %#X", a, a);//使用 printf 函数,以 %#o 和 %#X 格式打印变量 a 的值。
return 0;
}
解法二
题目要显示前导0和前导0X,那我们直接在%的前面加上前导0和前导0X就行了
#include
int main()
{
int a = 1234;
printf("0%o 0X%X", a, a);//使用 printf 函数,以 %#o 和 %#X 格式打印变量 a 的值。
return 0;
}
//解法一
#include
int main() {
char ch;
int num;
float f;
scanf("%c%d%f", &ch, &num, &f);//注意,本题是字符先输入的,所以不会出问题,如果整形先输入,会留下回车'\n'字符在输入缓冲区,然后被ch读取,造成错误
printf("%c %d %.6f", ch, num, f);
return 0;
}
#include
int main()
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
printf("%d%8d%8d", a, b, c);//%8d右对齐
//printf("%-8d%-8d%d", a, b, c);//两种写法都可以,-8d左对齐
}
#include
int main() {
int a, b;
scanf("%x%o", &a, &b);//注意格式
printf("%d", a + b);
return 0;
}
#include
int main() {
int a, b;
scanf("%d%d", &a, &b);
if (a >= 0 && b <= 1000 )//判断输入数据的范围
printf("%d", a + b);
return 0;
}
#include
int main() {
int a, b;
scanf("%d %d", &a, &b);
printf("%d", a / b);//整数除法会截断取整
return 0;
}
#include
//取余运算符的两边操作数只能为整数
int main()
{
int a = 0, b = 0;
scanf("%d %d", &a, &b);
printf("%d", a % b);
return 0;
}
#include
int main() {
float num = 0.0f; // 声明一个浮点数变量,并初始化为0.0
scanf("%f", &num); // 从标准输入读取一个浮点数并存储在num中
// 判断num是否大于0且小于200或者等于200
if (num > 0 && num <= 200) {
int num2 = (int)num; // 将num转换为整数
printf("%d", num2 % 10); // 输出num2除以10的余数
}
return 0;
}
解法二
利用modf函数取出浮点数的整数部分存到num2中
#include
#include
int main() {
double num1 ;// 声明一个双精度浮点数变量num1
double num2;// 声明一个双精度浮点数变量num2
scanf("%f", &num1);
modf(num1, &num2); // 使用modf函数将num1分解为整数部分和小数部分,并将整数部分存储在num2中
printf("%d", (int)num2 % 10);//这里一定要加强制转换为整型,因为取模运算操作数要求为整型,num2里存放的虽然是整数,但不是整型整数,而是浮点型整数,这点要注意好
return 0;
}
//C 库函数 double modf(double x, double *integer) 返回值为小数部分(小数点后的部分),并设置 integer 为整数部分。
解法三
利用指针解引用指向的元素判断小数点的位置,输出小数点前的元素即为浮点数对应的个位数
#include
int main() {
char num[100] = {'\0'};
scanf("%s", num);
char* p = num;//p里存放的num首元素的地址
while (*p != '.') {
p++;//指针自增
}
printf("%c", *(p - 1));//打印
return 0;
}
#include
int main() {
int fee = 100;
int x;
scanf("%d", &x);
printf("%d", fee * x);//计算票钱*人数
return 0;
}
#include
int main() {
int a, b;
scanf("%d%d", &a, &b);
if (a > 0 && b < 10000)//检查a是否大于0且b是否小于10000。只有当这两个条件都满足时,才会执行下面的代码块。
printf("%d %d", a / b, a % b);//使用printf函数输出a除以b的商和余数。%d是一个格式说明符,表示要输出的是一个整数。
return 0;
}
解法一
本题不用分类讨论a是否大于9,即使a小于9,用10取余依旧会得到它本身,比如0除9商0余9
#include
int main()
{
int a;
scanf("%d", &a);
printf("%d %d", a % 10);//通过取模运算得到a的个位数。例如,如果a是123,那么a % 10的结果是3。
return 0;
}
#include
int main()
{
int a;
scanf("%d",&a);
printf("%d",a%100/10);//首先通过取模运算得到a的后两位数。然后通过除法运算得到a的十位数。例如,如果a是123,那么a % 100的结果是23,再除以10得到2。
return 0;
}
解法一
星期几+天数如果小于等于7,直接相加的就是往后推X天变成星期几,如果相加大于7,就除7看是否能整除,能整除就是星期日,不能整除余数是几就是星期几。
//解法一
#include
int main() {
int date1, days; //定义date1变量表示初始星期几,days表示天数
scanf("%d%d", &date1, &days);
if (date1 + days < 8) //如果date1+days小于等于7,直接相加的就是往后推X天变成星期几
printf("%d", date1 + days);
else
{
if ((date1 + days) % 7 == 0) //如果相加大于7,就除7看是否能整除,能整除就是星期日
printf("7");
else
printf("%d", (date1 + days) % 7);//不能整除余数是几就是星期几
}
return 0;
}
解法二
不用考虑星期几+天数是不是大于或小于7,即使小于7,(X+N)%7之后商零,余数等于被除数
#include
int main()
{
int X, N, res;
scanf("%d %d", &X, &N);//不用x+n考虑是不是大于或小于7,即使小于7,(X+N)%7之后商零,余数等于被除数
res = (X + N) % 7;
printf("%d", res ? res : 7);//(x+n)%7未被整除的情况下,res为真,表达式结果就是res的值, 被整除的情况下,res为0,打印7
return 0;
}
解法三
思路–> 原天数和延期天数之和少一天(2≤X+N≤1007),取余以后再加回去,以避免出现周日7倍数,结果为0的情况
#include
int main()
{
int Week, Day;
scanf("%d%d", &Week, &Day);
printf("%d\n", (Week + Day - 1) % 7 + 1); //避免出现周日余数为0,兼顾简洁易懂
return 0;
}
#include
int main() {
int seconds; // 声明一个整数变量seconds,用于存储用户输入的秒数。
int hour, min, sec;// 声明整数变量hour、min和sec,分别用于存储转换后的小时、分钟和秒。
scanf("%d", &seconds);
hour = seconds / 3600;// 将总秒数除以3600,得到小时数。
min = seconds % 3600 / 60;// 首先用取模运算符%得到不能被转换为小时的剩余秒数,然后除以60得到分钟数
// sec=seconds%3600%60;//剩余秒数的一种计算方法
sec = seconds % 60;//剩余秒数也可以直接总秒数%60,算出来的就是去掉被转换成小时和分钟的秒数,剩余的凑不够60s的秒数
printf("%d %d %d", hour, min, sec);
return 0;
}
总结:
回顾整个解析过程,我们发现C语言语法是基础中的基础,对于初学者来说,掌握基础语法是至关重要的。通过题目,我们可以快速巩固和加深对基础语法的理解。同时,也能够帮助我们提高编程思维和解决问题的能力。一题多解更是为了培养我们的逻辑思维和解决问题的能力。通过不断地刷题和总结,我们可以更好地掌握C语言的核心思想和应用技巧,为未来的学习和工作打下坚实的基础。
本文对每道题目都提供了多种解法和一些独特的解法,比如利用指针找到小数点位置,获取浮点数个位数。目的在于培养创新思维:一题多解鼓励初学者不满足仅仅得出一道习题的答案,而去追求更独特、更快捷的解题方法,有助于培养创新思维。
下期再见bye!
牛客网刷题解析第三期请点这里