• c刷题(四)


    目录

    获得月份天数

    判断字母

    字母大小写转换 

    网购

    下列程序段的输出结果

    字符逆序 

     自幂数

    a的前n项之和 

    最小公倍数

      倒置字符串


    获得月份天数

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

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

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. int year_run(int n)
    5. {
    6. if (((n % 4 == 0) && n % 100 != 0)||(n % 400 == 0))
    7. return 1;
    8. else
    9. return 0;
    10. }
    11. int main()
    12. {
    13. int y = 0;
    14. int m = 0;
    15. int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    16. while(scanf("%d%d", &y, &m) != EOF)//多组输入
    17. {
    18. assert(m>0&&m<13);//断言
    19. int day = days[m];
    20. if(year_run(y) && m==2)
    21. day++;
    22. printf("%d\n",day);
    23. }
    24. return 0;
    25. }

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

    判断字母

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

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

    1. #include
    2. int main ()
    3. {
    4. int ch=0;
    5. while(scanf("%c\n",&ch)!=EOF)
    6. //while(ch = getchar() !=EOF)//读取失败返回-1
    7. {
    8. if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))
    9. {printf("%c is an alphabet.\n",ch);}
    10. else
    11. {printf("%c is not an alphabet.\n",ch);}
    12. //getchar();
    13. }
    14. return 0;
    15. }

    字母大小写转换 

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

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

    1. #include
    2. int main() {
    3. char ch;
    4. while (scanf("%c", &ch) != EOF) { //加\n会使结果错位
    5. if (ch <= 'z' && ch >= 'a')
    6. printf("%c\n", ch - 32);
    7. if (ch <= 'Z' && ch >= 'A')//其他字符忽略掉了题目没做要求
    8. printf("%c\n", ch + 32);//不排除其他字符
    9. getchar();//去\n
    10. }
    11. return 0;
    12. }
    1. //库函数
    2. #include
    3. #include
    4. int main()
    5. {
    6. int ch = 0;
    7. while((ch=getchar()) != EOF)
    8. {
    9. if(islower(ch))//判断小写函数
    10. {
    11. printf("%c\n", toupper(ch));
    12. }
    13. else
    14. {
    15. printf("%c\n", tolower(ch));
    16. }
    17. getchar();
    18. }
    19. return 0;
    20. }

    别忘了清理缓冲区!

    网购

    网购_牛客题霸_牛客网

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

    1. #include
    2. int main() {
    3. double p;
    4. int m, n,discount;
    5. scanf("%lf %d %d %d", &p, &m, &n, &discount);
    6. if (m == 11 && n == 11)
    7. {
    8. p = p * 0.7 - discount * 50;
    9. }
    10. else if(m == 12 && n == 12)
    11. p = p * 0.8 - discount * 50;
    12. if (p < 0)
    13. p = 0;
    14. printf("%.2lf", p);
    15. return 0;
    16. }

    下列程序段的输出结果

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

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

    字符逆序 

    字符逆序__牛客网

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

    1. #include
    2. #include
    3. int main() {
    4. char arr[10001] = {0};
    5. gets(arr);
    6. int num = strlen(arr)-1;//下标
    7. char* left = arr;
    8. char* right = arr+num;
    9. while(left
    10. {
    11. char tmp = *left;
    12. *left = *right;
    13. *right = tmp;
    14. left++;
    15. right--;
    16. }
    17. puts(arr);//输出
    18. return 0;
    19. }

     自幂数

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

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

    1. int water(int c,int num)//递归
    2. {
    3. if (c < 10)
    4. {
    5. return (int)pow(c, num);
    6. }
    7. int n = water(c / 10,num);
    8. return (int)pow(c % 10, num) + n;
    9. }int count_num(int i)
    10. {
    11. int num = 0;
    12. if (i < 10)
    13. {
    14. return ++num;
    15. }
    16. return 1 + count_num(i / 10);//记录次数
    17. }
    18. int main()
    19. {
    20. int i = 0;
    21. for (i = 0; i < 100000; i++)
    22. {
    23. //计算位数
    24. if (i == water(i,count_num(i)))
    25. printf("%d ", i);
    26. }
    27. return 0;
    28. }

    a的前n项之和 

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

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

    1. int main()
    2. {
    3. int a = 0;
    4. int n = 0;
    5. int i = 0;
    6. int sum = 0;
    7. int tmp = 0;
    8. scanf("%d%d", &a, &n);
    9. for(i=0; i
    10. {
    11. tmp = tmp*10+a;
    12. sum += tmp;
    13. }
    14. printf("%d\n", sum);
    15. return 0;
    16. }

    最小公倍数

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

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

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

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

    1. int m, n;
    2. int i = 1;
    3. while (scanf("%d %d", &m, &n) == 2)
    4. {
    5. if (m > n)
    6. {
    7. int tmp = m;
    8. m = n;
    9. n = tmp;
    10. }
    11. for (i = 1; m * i % n != 0; i++)
    12. {
    13. ;
    14. }
    15. printf("%d\n", m * i);
    16. }

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

      倒置字符串

    倒置字符串__牛客网

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

    1. #include
    2. #include
    3. #include
    4. void reverse(char* left,char* right)
    5. {
    6. assert(left && right);//断言
    7. while(left
    8. {
    9. int tmp = *left;
    10. *left = *right;
    11. *right = tmp;
    12. left++;
    13. right--;
    14. }
    15. }
    16. int main() {
    17. char arr[101] = {0};
    18. gets(arr);
    19. char* cur = arr;//记录指针
    20. while(*cur)
    21. {
    22. char*start = cur,*end = cur;//单词首尾指针
    23. while(*end != ' ' && *end != '\0')
    24. {
    25. end++;
    26. }
    27. reverse(start,end-1);
    28. if(*end)
    29. cur = end + 1;
    30. else
    31. cur = end;
    32. }
    33. int len = strlen(arr)-1;
    34. reverse(arr,arr+len);//整体逆置
    35. printf("%s\n",arr);
    36. return 0;
    37. }

  • 相关阅读:
    Golang基础3-函数、nil相关
    搭建微信小程序环境及项目结构介绍
    jQuery注册事件的发展历程(简单/bind/delegate/on)
    Java知识点之单例模式
    go 语言 负载均衡 为反向代理添加负载均衡 拓展ReverseProxy
    Python(四)字符串
    吃鸡达人必备!超实用干货激爽分享!
    【React】React学习:从初级到高级(四)
    linux取证——基础取证命令集合
    【深蓝学院】手写VIO第7章--VINS初始化和VIO系统--作业
  • 原文地址:https://blog.csdn.net/dwededewde/article/details/132793258