c刷题(四)

news/2025/1/16 5:53:11/

目录

获得月份天数

判断字母

字母大小写转换 

网购

下列程序段的输出结果

字符逆序 

 自幂数

a的前n项之和 

最小公倍数

  倒置字符串


获得月份天数

获得月份天数_牛客题霸_牛客网

这道题可以用switch case语句解,不过这道题更简单的方法是数组,关键点在于判断是否为闰年。 

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
int year_run(int n)
{if (((n % 4 == 0) && n % 100 != 0)||(n % 400 == 0))return 1;elsereturn 0;
}
int main()
{int y = 0;int m = 0;int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; while(scanf("%d%d", &y, &m) != EOF)//多组输入{assert(m>0&&m<13);//断言int day = days[m];if(year_run(y) && m==2)day++;printf("%d\n",day);}return 0;
}

 判断闰年和2月可以合并成一条语句用&&操作符连结,将数组下标0设置成0与月份对应,也可以添加断言是程序更加健壮。

判断字母

判断是不是字母_牛客题霸_牛客网

在用getchar或scanf读取字母的时候,我们的回车键(\n)会被保存下来,导致输出错误结果。所以这道题的关键是清理\n

#include <stdio.h>int main ()
{int ch=0;while(scanf("%c\n",&ch)!=EOF)
//while(ch = getchar() !=EOF)//读取失败返回-1{if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')){printf("%c is an alphabet.\n",ch);}else{printf("%c is not an alphabet.\n",ch);}//getchar();}
return  0;
}

字母大小写转换 

 字母大小写转换_牛客题霸_牛客网

利用ascii码的一一映射关系解决,也可以使用c语言的库函数——toupper(转大写)tolower(转小写)来转化。

#include <stdio.h>int main() {char ch;while (scanf("%c", &ch) != EOF) { //加\n会使结果错位if (ch <= 'z' && ch >= 'a')printf("%c\n", ch - 32);if (ch <= 'Z' && ch >= 'A')//其他字符忽略掉了题目没做要求printf("%c\n", ch + 32);//不排除其他字符getchar();//去\n}return 0;
}
//库函数
#include<ctype.h>
#include <stdio.h>int main()
{int ch = 0;while((ch=getchar()) != EOF){if(islower(ch))//判断小写函数{printf("%c\n", toupper(ch));}else{printf("%c\n", tolower(ch)); }getchar();}return 0;
}

别忘了清理缓冲区!

网购

网购_牛客题霸_牛客网

并不难,主要是想分享用0和1表示优惠券这个妙处,省去了多余的判断。

#include <stdio.h>int main() {double p;int m, n,discount;scanf("%lf %d %d %d", &p, &m, &n, &discount);if (m == 11 && n == 11){p = p * 0.7 - discount * 50;}else if(m == 12 && n == 12)p = p * 0.8 - discount * 50;if (p < 0)p = 0;printf("%.2lf", p);return 0;
}

下列程序段的输出结果

unsigned long pulArray[] = {6,7,8,9,10};
unsigned long *pulPtr;
pulPtr = pulArray;
*(pulPtr + 3) += 3;
printf("%d,%d\n",*pulPtr, *(pulPtr + 3));

访问第4个元素的地址并解引用对值+3然后赋值给第四个pulArray[3]这个变量,可以理解为pulArray[0+3] = pulArray[0+3]+3。打印结果为6,12

字符逆序 

字符逆序__牛客网

这道题用scanf输入数据显然是不合理的,我们可以用gets函数输入一行字符串,结束标志为\n,然后记录数组首尾指针进行交换(不包括\0)。 

#include <stdio.h>
#include<string.h>
int main() {char arr[10001] = {0};gets(arr);int num = strlen(arr)-1;//下标char* left = arr;char* right = arr+num;while(left<right){char tmp = *left;*left = *right;*right = tmp;left++;right--;}puts(arr);//输出return 0;
}

 自幂数

求出0~100000之间的所有“水仙花数”并输出。

要点:灵活运用pow函数求次方并记录每一位数求相应位数的次方数。

int water(int c,int num)//递归 
{if (c < 10){return (int)pow(c, num);}int n = water(c / 10,num);return (int)pow(c % 10, num) + n;
}int count_num(int i)
{int num = 0;if (i < 10){return ++num;}return 1 + count_num(i / 10);//记录次数
}
int main()
{int i = 0;for (i = 0; i < 100000; i++){//计算位数if (i == water(i,count_num(i)))printf("%d ", i);}return 0;
}

a的前n项之和 

求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,例如:2+22+222+2222+22222

 找规律:前面的数乘以10+a为后面的一项。那第一项就是0*10+a。

int main()
{int a = 0;int n = 0;int i = 0;int sum = 0;int tmp = 0;scanf("%d%d", &a, &n);for(i=0; i<n; i++){tmp = tmp*10+a;sum += tmp;}printf("%d\n", sum);return 0;
}

最小公倍数

方法一:选两个数较大值记为x,不断++直到x能整除二者。

方法二:辗转相除法求最大公倍数(k)然后利用公式 m*n/k 

方法三:选两个数较小值按倍数递增去试除二者,直至都能被整除。

前面两个方法之前已经实现过了,我们来看第三个方法:

	int m, n;int i = 1;while (scanf("%d %d", &m, &n) == 2){if (m > n){int tmp = m;m = n;n = tmp;}for (i = 1; m * i % n != 0; i++){;}printf("%d\n", m * i);}

提示:如果数据过大可以将int改为long类型

  倒置字符串

倒置字符串__牛客网

思路:单词倒置+整体倒置(可以改变顺序),每个单词倒置同样需要记录首尾指针,尾为空格-1,整体结束条件为\0注意最后一个单词的结束条件也为\0.

#include <stdio.h>
#include <string.h>
#include <assert.h>
void reverse(char* left,char* right)
{assert(left && right);//断言while(left<right){int tmp = *left;*left = *right;*right = tmp;left++;right--;}
}
int main() {char arr[101] = {0};gets(arr);char* cur = arr;//记录指针while(*cur){char*start = cur,*end = cur;//单词首尾指针while(*end != ' ' && *end != '\0'){end++;}reverse(start,end-1);if(*end)cur = end + 1;elsecur = end;}int len = strlen(arr)-1;reverse(arr,arr+len);//整体逆置printf("%s\n",arr);return 0;
}


http://www.ppmy.cn/news/1118984.html

相关文章

Remmina中VNC、SSH和RDP的区别

Remmina 可以在 Linux 系统上对远程进行连接。它支持多种远程连接协议&#xff0c;包括 VNC&#xff08;Virtual Network Computing&#xff09;、SSH&#xff08;Secure Shell&#xff09;和 RDP&#xff08;Remote Desktop Protocol&#xff09;。这些协议用于实现不同类型的…

如何开发一个微信查询系统

教师们常常需要发布学生成绩&#xff0c;并让学生方便地查询。为了提高效率和便利性&#xff0c;开发一个微信学生成绩查询发布系统是一种有效的解决方案。本文将介绍如何开发这样一个系统&#xff0c;使教师能够轻松管理学生成绩&#xff0c;并让学生方便的查询自己的成绩。 …

vue若依前端项目搭建

1.项目搭建 首先进入到你需要创建的项目目录下面&#xff0c;然后输入命令vue create .创建项目 接下来选择手动搭建&#xff0c;然后把下面图片中的内容选上 再然后继续配置一些参数信息 接下来运行npm run serve项目就启动起来了 2.配置登录界面文件 首先修改src/router…

学习记忆——宫殿篇——记忆宫殿——记忆桩——火车+外院+客厅+卧室

护板 警示灯 烟筒 采集箱 司炉室 桥 电线杆 棚顶 车厢 护栏 植物 石阶 水泥台 竹门 树干 躺椅 柱子 墙 池 洞 方灯 枕头 树 浴池 墙 射灯 藤条 浴巾框 耳环 窗户 灯 沙发 壁炉 吊灯 兵马俑 门 石佛 沙发椅 圆木 弧形木箱盖 床 窗帘 画板 纸伞 花 沙发背 颜料 抽屉

计算机视觉与深度学习-全连接神经网络-训练过程-模型正则与超参数调优- [北邮鲁鹏]

目录标题 神经网络中的超参数学习率超参数优化方法网格搜索法随机搜索法 超参数搜索策略粗搜索精搜索 超参数的标尺空间 神经网络中的超参数 超参数 网络结构&#xff1a;隐层神经元个数&#xff0c;网络层数&#xff0c;非线性单元选择等优化相关&#xff1a;学习率、dorpou…

yolov7添加GAMAttention注意力机制,同时添加CNeB,C3C2

1&#xff0c;common.py配置 ./models/common.py文件增加以下模块 class GAMAttention(nn.Module):#https://paperswithcode.com/paper/global-attention-mechanism-retain-informationdef __init__(self, c1, c2, groupTrue,rate4):super(GAMAttention, self).__init__()sel…

期权如何交易?期权如何做模拟交易?

买卖期权的第一步就是要有期权账户&#xff0c;国内的期权品种有商品期权和ETF期权以及股指期权&#xff0c;每种的开户方式和要求都不同&#xff0c;下文为大家介绍期权如何交易&#xff1f;期权如何做模拟交易&#xff1f; 一、期权交易需要开立一个期权账户&#xff0c;可以…

python经典百题之统计字符数

题目&#xff1a;输入一行字符&#xff0c;分别统计出其中英文字母、空格、数字和其它字符的个数。 方法一&#xff1a; str_input input("请输入一行字符&#xff1a;") count_letter, count_space, count_digits, count_other 0, 0, 0, 0 for char in str_inpu…