• 牛客网c语言入门题


    前言:

    首先感谢大家支持,我相信每个人都是为了学习而来,不断地挑战自己能力,不断地武装自己知识储备。为了方便大家找题库,我把这刷题网址分享出来,当然我自己也没有刷完。

    牛客网入门:https://www.nowcoder.com/ta/beginner-programmers 

    PTA:https://pintia.cn/problem-sets/994805046380707840/problems/type/7

    牛客网进阶刷题:https://www.nowcoder.com/activity/oj

    力扣:https://leetcode-cn.com/

    循环输出图形

    1.x形图案

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int x;
    5. while(~scanf("%d",&x))
    6. {
    7. for(int i=0;i<x;i++)
    8. {
    9. for(int j=0;j<x;j++)
    10. {
    11. if(i==j||i+j==x-1)
    12. {
    13. printf("*");
    14. }
    15. else
    16. {
    17. printf(" ");
    18. }
    19. }
    20. printf("\n");
    21. }
    22. }
    23. return 0;
    24. }

    x就是正斜杠与反斜杠相交叉,当我们把它看成一个数组里面放的空格和*,在[i][i]时是*,              在[i][n-1-j]时也是*,所以我们在打印的时候,我们用if判断出该打印出的*其他就为空格,这里就有两种情况,i==j时和i=n-i-j时。

    2. 圣诞树

    1. int main()
    2. {
    3. int c = 1;;
    4. int n = 0;
    5. scanf("%d", &n);
    6. int d = 3 * n;
    7. for (int i = 1; i <= n; i++)//树叶
    8. {
    9. for (int a = d -1;a>0;a--)
    10. {
    11. printf(" ");
    12. }
    13. for (int k = 1; k <= i; k++)
    14. {
    15. printf("* ");
    16. }
    17. printf("\n");
    18. for (int a = d - 2; a > 0; a--)
    19. {
    20. printf(" ");
    21. }
    22. for (int k = 1; k <= i; k++)
    23. {
    24. printf("* * ");
    25. }
    26. printf("\n");
    27. for (int a = d-3; a > 0; a--)
    28. {
    29. printf(" ");
    30. }
    31. for (int k = 1; k <= i; k++)
    32. {
    33. printf("* * * ");
    34. }
    35. printf("\n");
    36. d = d - 3;
    37. }
    38. while (c<=n)//树干
    39. {
    40. for (int i = 1; i <= (6 * n - 1) / 2; i++)
    41. {
    42. printf(" ");
    43. }
    44. printf("*\n");
    45. c++;
    46. }
    47. return 0;
    48. }

    注意:确定好最开始有多少个空格(d=3*n-1),确定好下一个三角形循环的第一个*的位置 (d=d-3);

    一维数组

    3.在有序数组插入一个整数

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int n,x;
    5. scanf("%d",&n);
    6. int arr[255]={0};
    7. for(int i=0;i<n;i++)//输入数组
    8. {
    9. scanf("%d",&arr[i]);
    10. }
    11. scanf("%d",&x);
    12. int i=0;
    13. while(arr[i]<x&&i<n)//确定插入位置
    14. {
    15. i++;
    16. }
    17. int set=i;
    18. for(int i=n-1;i>=set;i--)//将set位置前面的值向前移,再将set数组值赋值到数组中
    19. {
    20. arr[i+1]=arr[i];
    21. }
    22. arr[set]=x;
    23. for(int i=0;i<=n;i++)//打印数组
    24. {
    25. printf("%d ",arr[i]);
    26. }
    27. return 0;
    28. }

    4.序列中删除指定数字

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int a[50];
    5. int n,x;
    6. while(scanf("%d",&n)!=EOF)//多组输入
    7. {
    8. int i;
    9. for(i=0;i<n;i++)//输入数组
    10. {
    11. scanf("%d",&a[i]);
    12. }
    13. scanf("%d",&x);
    14. for(i=0;i<n;i++)//删除指定值
    15. {
    16. if(a[i]!=x)
    17. {
    18. printf("%d ",a[i]);
    19. }
    20. }
    21. }

    5.序列中整数去重

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int n;
    5. scanf("%d",&n);
    6. int arr1[255]={0};
    7. int arr2[255]={0};
    8. int k=0;
    9. int flag=0//定义开关,通过判断不相等时将arr1赋值到arr2
    10. for(int i=0;i<n;i++)//输入数组
    11. {
    12. scanf("%d",&arr1[i]);
    13. }
    14. for(int i=0;i<n;i++)//外循环
    15. {
    16. flag=0;
    17. for(int j=0;j<i;j++)//内循环
    18. {
    19. if(arr1[i]==arr1[j])
    20. {
    21. flag=1;
    22. break;
    23. }
    24. }
    25. if(flag!=1)
    26. {
    27. arr2[k++]=arr1[i];
    28. }
    29. }
    30. for(int i=0;i<k;i++)//打印数组
    31. {
    32. printf("%d ",arr2[i]);
    33. }
    34. return 0;
    35. }

    二维数组

    6.回型矩阵

    1. #include<stdio.h>
    2. int main()
    3. {
    4. int n,i;
    5. scanf("%d",&n);
    6. int a[n][n];
    7. int row=0,col=n-1;
    8. int count=1;
    9. while(count<=n*n)
    10. {
    11. for(i=row;i<=col;i++)
    12. {
    13. a[row][i]=count++; //控制第一行;
    14. }
    15. for(i=row+1;i<=col;i++)
    16. {
    17. a[i][col]=count++; //控制最右边一列;
    18. }
    19. for(i=col-1;i>=row;i--)
    20. {
    21. a[col][i]=count++; //控制最下面一行
    22. }
    23. for(i=col-1;i>row;i--) //控制最左边一列
    24. {
    25. a[i][row]=count++;
    26. }
    27. row++; //控制内部同上只不过行+,列-;
    28. col--;
    29. }
    30. for(row=0;row<n;row++)
    31. {
    32. for(col=0;col<n;col++)
    33. {
    34. printf("%d ",a[row][col]); //打印;
    35. }
    36. printf("\n");
    37. }
    38. return 0;
    39. }

    7.蛇形矩阵

    明确方向:主要有两个方向左和右,上(左上,左),下(右下,右)。我们通过1,-1来判断方向,这里定义的flag变量。

    逻辑推理: i代表------------j代表

    1. 碰到上边界(即i等于1 且 j小于n): 列增加1,行不变--------往右移动一格
    2. 碰到左边界(即j等于1 且 i小于n): 行增加1,列不变--------往下移动一格
    3. 碰到右边界(即j等于n): 行增加1,列不变--------往下移动一格
    4. 碰到下边界(即i等于n): 列增加1,行不变--------往右移动一格
    5. 除去上面四种的边界情况,就是在边界中间的左下移动
    6. 除去上面四种的边界情况,就是在边界中间的右上移动
    1. #include <stdio.h>
    2. int main()
    3. {
    4. int n;
    5. scanf("%d",&n);
    6. int i=1,j=1,pos=1; //pos代表方向移动 1代表右上 -1代表左下
    7. int arr[100][100]={0};
    8. arr[i][j]=1;
    9. for(int k=2;k<=n*n;k++)
    10. {
    11. if (i == 1 && j <n && pos ==1) //碰到上边界,列增加1,行不变 此后行增,列减
    12. {
    13. arr[i][++j] = k;
    14. pos = -1; //方向注意
    15. }
    16. else if(j==1 && i<n && pos == -1)//碰到左边界,行增加1,列不变 此后行减,列增
    17. {
    18. arr[++i][j] = k;
    19. pos = 1; //方向注意
    20. }
    21. else if (j == n && pos==1) //碰到左边界,行增加1,列不变 此后行增,列减
    22. {
    23. arr[++i][j] = k;
    24. pos = -1; //方向注意
    25. }
    26. else if (i == n && pos ==-1) //碰到右边界,列增加1,行不变 此后行减,列增
    27. {
    28. arr[i][++j] = k;
    29. pos = 1;
    30. }
    31. else if (pos == 1) //除去上面的边界情况,就是中间移动过程
    32. {
    33. arr[--i][++j] = k;
    34. }
    35. else if(pos == -1)
    36. {
    37. arr[++i][--j] = k;
    38. }
    39. }
    40. for(i=1;i<=n;i++)
    41. {
    42. for(j=1;j<=n;j++)
    43. {
    44. printf("%d ",arr[i][j]);
    45. }
    46. printf("\n");
    47. }
    48. return 0;
    49. }

    字符/字符数组

    8.简写单词

    1. #include <stdio.h>
    2. int main()
    3. {
    4. char s[200]={0};
    5. while(~scanf("%s==",s))//多次打印
    6. {
    7. if (s[0] >= 65 && s[0] <= 90) 如果大写就打印
    8. {
    9. printf("%c", s[0]);
    10. }
    11. else
    12. printf("%c", s[0] - 32);如果小写就转成大写打印
    13. }
    14. return 0;
    15. }

    函数

    9.牛牛的素数和

    1. //dome1:
    2. #include <stdio.h>
    3. int is_prime(int n)
    4. {
    5. int i = 0;
    6. for(i = 2;i<n;i++)
    7. {
    8. if(n%i==0)
    9. {
    10. return 0;
    11. }
    12. }
    13. return 1;
    14. }
    15. int main()
    16. {
    17. int l = 0;
    18. int r = 0;
    19. scanf("%d %d",&l,&r);
    20. int i = 0;
    21. int sum = 0;
    22. for(i=l;i<=r;i++)
    23. {
    24. //判断是否为素数的函数
    25. if(1==is_prime(i))
    26. {
    27. sum+=i;
    28. }
    29. }
    30. printf("%d\n",sum);
    31. return 0;
    32. }
    33. //dome2:
    34. #include <stdio.h>
    35. int main()
    36. {
    37. int x,y;
    38. scanf("%d %d",&x,&y);
    39. int count=0;
    40. int sum=0;
    41. for(int i=x;i<=y;i++)
    42. {
    43. for(int j=1;j<=i;j++)
    44. {
    45. if(i%j==0)
    46. {
    47. count++;
    48. }
    49. }
    50. if(count==2)
    51. {
    52. sum += i;
    53. }
    54. count=0;
    55. }
    56. printf("%d",sum);
    57. return 0;
    58. }

    10.素数回文

    1. #include <stdio.h>
    2. #include <math.h>
    3. long long fun(long long t)//回文
    4. {
    5. int ret=t;
    6. while(ret>9)
    7. {
    8. ret/=10;
    9. t=(t*10+ret%10);
    10. }
    11. return t;
    12. }
    13. int isPrime(long long num)//判断素数
    14. {
    15. int temp=sqrt(num);
    16. for(int i= 2;i <=temp; i++)
    17. if(num %i== 0)
    18. return 0 ;
    19. return 1 ;
    20. }
    21. int main()
    22. {
    23. long long n;
    24. scanf("%lld", &n);
    25. if (isPrime(fun(n)))
    26. {
    27. printf("prime");
    28. }
    29. else
    30. {
    31. printf("noprime");
    32. }
    33. return 0;
    34. }

    11.#[NOIP1999]回文数#

    1. #include <stdio.h>
    2. int n;
    3. int arr[20] = {0}, arr_r[20] = {0};
    4. char crr[10] = {0};
    5. int lenght = 0;
    6. void func_crr_to_arr()
    7. {
    8. for(lenght = 1; crr[lenght-1] != 0 ; lenght++)
    9. {
    10. if(crr[lenght-1] >= '0' && crr[lenght-1] <= '9') arr[lenght] = crr[lenght-1] - '0';
    11. else if(crr[lenght-1] >= 'A' && crr[lenght-1] <= 'F') arr[lenght] = crr[lenght-1] - 'A' + 10;
    12. }
    13. lenght -= 1;
    14. }
    15. int func_arr_palindrome_judge()
    16. {
    17. for(int i = 1; i <= lenght ; i++)
    18. {
    19. if(arr[i] != arr[lenght - i + 1])
    20. return 0;
    21. }
    22. return 1;
    23. }
    24. void func_get_arr_reserve()
    25. {
    26. for(int i = 1; i <= lenght ; i++)
    27. {
    28. arr_r[i] = arr[lenght - i + 1];
    29. }
    30. }
    31. void func_arr_reset()
    32. {
    33. for(int i = lenght; i > 0; i--)
    34. {
    35. if((arr[i] + arr_r[i]) / n != 0 )
    36. {
    37. arr[i - 1] ++;
    38. arr[i] = arr[i] + arr_r[i] - n;
    39. }
    40. else
    41. {
    42. arr[i] = arr[i] + arr_r[i];
    43. }
    44. }
    45. if(arr[0] != 0)
    46. {
    47. for(int i = lenght; i >= 0; i--)
    48. {
    49. arr[i + 1] = arr[i];
    50. }
    51. arr[0] = 0;
    52. lenght ++;
    53. }
    54. }
    55. int main()
    56. {
    57. int step = 0;
    58. scanf("%d", &n);
    59. scanf("%s", &crr);
    60. func_crr_to_arr();
    61. while(!func_arr_palindrome_judge())
    62. {
    63. func_get_arr_reserve();
    64. func_arr_reset();
    65. step ++;
    66. if(step >= 30)break;
    67. }
    68. if(step >= 30)printf("Impossible!");
    69. else printf("STEP=%d", step);
    70. return 0;
    71. }

    12.汉罗塔问题

    规律:n=1 --> 3-1,n==2 -->3*3-1 ,n==3 -->3*3-1,n==4-->3*3*3-1

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

    13.牛牛的素数判断

    1. //记住判断素数%2==0就OK了
    2. #include <stdio.h>
    3. int main()
    4. {
    5. int n,a;
    6. scanf("%d",&n);
    7. for(int i=0;i<n;i++)
    8. {
    9. scanf("%d",&a);
    10. int count=0;
    11. for(int j=2;j<a;j++)
    12. {
    13. if(a%j ==0)
    14. {
    15. count++;
    16. }
    17. }
    18. if(count==0)
    19. printf("true\n");
    20. else
    21. printf("false\n");
    22. }
    23. return 0;
    24. }

    递归函数

    13.小乐乐走台阶-斐波拉西数列

    规律:0、1、1、2、3、5、8、13、21、34、……

    1. #include <stdio.h>
    2. int fib(int x)
    3. {
    4. if(x<=2)
    5. return x;
    6. else
    7. return fib(x-1)+fib(x-2);
    8. }
    9. //列如5
    10. //5->4 3->3 2 1 2->1 2 2 1 2
    11. //结果1+2+2+1+2 =8
    12. int main()
    13. {
    14. int n;
    15. scanf("%d",&n);
    16. int ret=fib(n);
    17. printf("%d",ret);
    18. return 0;
    19. }

    14.函数实现计算一个数的阶乘

    1. #include <stdio.h>
    2. long long factorial(int n)
    3. {
    4. if(n<=2)
    5. return n;
    6. else
    7. return n*factorial(n-1);
    8. }
    9. int main()
    10. {
    11. int n;
    12. scanf("%d",&n);
    13. long long ret=factorial(n);
    14. printf("%lld",ret);
    15. return 0;
    16. }

    15.牛牛的排列数

    1. #include <stdio.h>
    2. int A(int n,int m)
    3. {
    4. if(m==1)
    5. return n;
    6. else
    7. return n*A(n-1,m-1);
    8. }
    9. //列如5 4
    10. //5-1,4-1 -> 4-1,3-1 -> 3-1,2-1
    11. //4,3 -> 3,2 -> 2,1 return n;
    12. //n=2,3,4 return n*2*3*4
    13. //结果:5*4*3*2=120
    14. int main()
    15. {
    16. int n,m;
    17. scanf("%d %d",&n,&m);
    18. int ret=A(n,m);
    19. printf("%d",ret);
    20. return 0;
    21. }

     16.逆序输出

    1. void reverse(int a)
    2. {
    3. if(a>0)
    4. {
    5. printf("%d",a%10);
    6. reverse(a/10);
    7. }
    8. }
    9. main()
    10. {
    11. int a=0;
    12. scanf("%d",&a);
    13. reverse(a);
    14. }

    最后希望大家学有所成!!!!

  • 相关阅读:
    docker部署 spring-boot 项目,验证码获取报错的解决方法
    计算机二级WPS 选择题(模拟和解析十一)
    PhotoSweeper X mac版 v4.8.5 相似重复照片清理工具 兼容 M1/M2
    Flutter命令行全局配置(command not found: flutter)
    如何为3D模型设置自发光材质?
    面向未来的大数据核心技术都有什么?
    UE5场景逐渐变亮问题
    Spring Boot:控制器调用模板引擎渲染数据的基本过程
    【微信小程序】实现手机全屏滚动字幕
    Google Earth Engine-06(GEE操作方法)
  • 原文地址:https://blog.csdn.net/includeevey/article/details/125409113