首先感谢大家支持,我相信每个人都是为了学习而来,不断地挑战自己能力,不断地武装自己知识储备。为了方便大家找题库,我把这刷题网址分享出来,当然我自己也没有刷完。
牛客网入门:https://www.nowcoder.com/ta/beginner-programmers
PTA:https://pintia.cn/problem-sets/994805046380707840/problems/type/7
牛客网进阶刷题:https://www.nowcoder.com/activity/oj
- #include <stdio.h>
- int main()
- {
- int x;
- while(~scanf("%d",&x))
- {
- for(int i=0;i<x;i++)
- {
- for(int j=0;j<x;j++)
- {
- if(i==j||i+j==x-1)
- {
- printf("*");
- }
- else
- {
- printf(" ");
- }
- }
- printf("\n");
- }
- }
-
- return 0;
- }
x就是正斜杠与反斜杠相交叉,当我们把它看成一个数组里面放的空格和*,在[i][i]时是*, 在[i][n-1-j]时也是*,所以我们在打印的时候,我们用if判断出该打印出的*其他就为空格,这里就有两种情况,i==j时和i=n-i-j时。


- int main()
- {
- int c = 1;;
- int n = 0;
- scanf("%d", &n);
- int d = 3 * n;
- for (int i = 1; i <= n; i++)//树叶
- {
- for (int a = d -1;a>0;a--)
- {
- printf(" ");
- }
- for (int k = 1; k <= i; k++)
- {
- printf("* ");
- }
- printf("\n");
- for (int a = d - 2; a > 0; a--)
- {
- printf(" ");
- }
- for (int k = 1; k <= i; k++)
- {
- printf("* * ");
- }
- printf("\n");
- for (int a = d-3; a > 0; a--)
- {
- printf(" ");
- }
- for (int k = 1; k <= i; k++)
- {
- printf("* * * ");
- }
- printf("\n");
- d = d - 3;
- }
- while (c<=n)//树干
- {
- for (int i = 1; i <= (6 * n - 1) / 2; i++)
- {
- printf(" ");
- }
- printf("*\n");
- c++;
- }
- return 0;
- }
注意:确定好最开始有多少个空格(d=3*n-1),确定好下一个三角形循环的第一个*的位置 (d=d-3);
- #include <stdio.h>
-
- int main()
- {
- int n,x;
- scanf("%d",&n);
- int arr[255]={0};
- for(int i=0;i<n;i++)//输入数组
- {
- scanf("%d",&arr[i]);
- }
- scanf("%d",&x);
-
- int i=0;
- while(arr[i]<x&&i<n)//确定插入位置
- {
- i++;
- }
- int set=i;
-
- for(int i=n-1;i>=set;i--)//将set位置前面的值向前移,再将set数组值赋值到数组中
- {
- arr[i+1]=arr[i];
- }
- arr[set]=x;
-
- for(int i=0;i<=n;i++)//打印数组
- {
- printf("%d ",arr[i]);
- }
-
- return 0;
- }
- #include <stdio.h>
-
- int main()
- {
- int a[50];
- int n,x;
-
- while(scanf("%d",&n)!=EOF)//多组输入
- {
- int i;
- for(i=0;i<n;i++)//输入数组
- {
- scanf("%d",&a[i]);
- }
- scanf("%d",&x);
-
- for(i=0;i<n;i++)//删除指定值
- {
- if(a[i]!=x)
- {
- printf("%d ",a[i]);
- }
- }
- }
- #include <stdio.h>
-
- int main()
- {
- int n;
- scanf("%d",&n);
- int arr1[255]={0};
- int arr2[255]={0};
- int k=0;
- int flag=0;//定义开关,通过判断不相等时将arr1赋值到arr2
-
- for(int i=0;i<n;i++)//输入数组
- {
- scanf("%d",&arr1[i]);
- }
-
- for(int i=0;i<n;i++)//外循环
- {
- flag=0;
- for(int j=0;j<i;j++)//内循环
- {
- if(arr1[i]==arr1[j])
- {
- flag=1;
- break;
- }
- }
- if(flag!=1)
- {
- arr2[k++]=arr1[i];
- }
- }
-
- for(int i=0;i<k;i++)//打印数组
- {
- printf("%d ",arr2[i]);
- }
-
- return 0;
- }
- #include<stdio.h>
- int main()
- {
- int n,i;
- scanf("%d",&n);
- int a[n][n];
- int row=0,col=n-1;
- int count=1;
- while(count<=n*n)
- {
- for(i=row;i<=col;i++)
- {
- a[row][i]=count++; //控制第一行;
- }
- for(i=row+1;i<=col;i++)
- {
- a[i][col]=count++; //控制最右边一列;
- }
- for(i=col-1;i>=row;i--)
- {
- a[col][i]=count++; //控制最下面一行
- }
- for(i=col-1;i>row;i--) //控制最左边一列
- {
- a[i][row]=count++;
- }
- row++; //控制内部同上只不过行+,列-;
- col--;
- }
- for(row=0;row<n;row++)
- {
- for(col=0;col<n;col++)
- {
- printf("%d ",a[row][col]); //打印;
- }
- printf("\n");
- }
- return 0;
- }


明确方向:主要有两个方向左和右,上(左上,左),下(右下,右)。我们通过1,-1来判断方向,这里定义的flag变量。
逻辑推理: 用i代表行------------j代表列
- 碰到上边界(即i等于1 且 j小于n): 列增加1,行不变--------往右移动一格
- 碰到左边界(即j等于1 且 i小于n): 行增加1,列不变--------往下移动一格
- 碰到右边界(即j等于n): 行增加1,列不变--------往下移动一格
- 碰到下边界(即i等于n): 列增加1,行不变--------往右移动一格
- 除去上面四种的边界情况,就是在边界中间的左下移动
- 除去上面四种的边界情况,就是在边界中间的右上移动
- #include <stdio.h>
-
- int main()
- {
- int n;
- scanf("%d",&n);
- int i=1,j=1,pos=1; //pos代表方向移动 1代表右上 -1代表左下
- int arr[100][100]={0};
- arr[i][j]=1;
- for(int k=2;k<=n*n;k++)
- {
- if (i == 1 && j <n && pos ==1) //碰到上边界,列增加1,行不变 此后行增,列减
- {
- arr[i][++j] = k;
- pos = -1; //方向注意
- }
- else if(j==1 && i<n && pos == -1)//碰到左边界,行增加1,列不变 此后行减,列增
- {
- arr[++i][j] = k;
- pos = 1; //方向注意
- }
- else if (j == n && pos==1) //碰到左边界,行增加1,列不变 此后行增,列减
- {
- arr[++i][j] = k;
- pos = -1; //方向注意
- }
- else if (i == n && pos ==-1) //碰到右边界,列增加1,行不变 此后行减,列增
- {
- arr[i][++j] = k;
- pos = 1;
- }
- else if (pos == 1) //除去上面的边界情况,就是中间移动过程
- {
- arr[--i][++j] = k;
- }
- else if(pos == -1)
- {
- arr[++i][--j] = k;
- }
- }
- for(i=1;i<=n;i++)
- {
- for(j=1;j<=n;j++)
- {
- printf("%d ",arr[i][j]);
- }
- printf("\n");
- }
-
- return 0;
- }

- #include <stdio.h>
-
- int main()
- {
- char s[200]={0};
- while(~scanf("%s==",s))//多次打印
- {
- if (s[0] >= 65 && s[0] <= 90) 如果大写就打印
- {
- printf("%c", s[0]);
- }
- else
- printf("%c", s[0] - 32);如果小写就转成大写打印
- }
-
- return 0;
- }
- //dome1:
-
- #include <stdio.h>
-
- int is_prime(int n)
- {
- int i = 0;
- for(i = 2;i<n;i++)
- {
- if(n%i==0)
- {
- return 0;
- }
- }
- return 1;
- }
- int main()
- {
- int l = 0;
- int r = 0;
- scanf("%d %d",&l,&r);
- int i = 0;
- int sum = 0;
- for(i=l;i<=r;i++)
- {
- //判断是否为素数的函数
- if(1==is_prime(i))
- {
- sum+=i;
- }
- }
- printf("%d\n",sum);
- return 0;
- }
-
- //dome2:
- #include <stdio.h>
-
- int main()
- {
- int x,y;
- scanf("%d %d",&x,&y);
-
- int count=0;
- int sum=0;
- for(int i=x;i<=y;i++)
- {
- for(int j=1;j<=i;j++)
- {
- if(i%j==0)
- {
- count++;
- }
- }
- if(count==2)
- {
- sum += i;
- }
- count=0;
- }
-
- printf("%d",sum);
- return 0;
- }
- #include <stdio.h>
- #include <math.h>
-
- long long fun(long long t)//回文
- {
- int ret=t;
- while(ret>9)
- {
- ret/=10;
- t=(t*10+ret%10);
- }
- return t;
- }
-
- int isPrime(long long num)//判断素数
- {
- int temp=sqrt(num);
- for(int i= 2;i <=temp; i++)
- if(num %i== 0)
- return 0 ;
- return 1 ;
- }
-
- int main()
- {
- long long n;
- scanf("%lld", &n);
-
- if (isPrime(fun(n)))
- {
- printf("prime");
- }
- else
- {
- printf("noprime");
- }
- return 0;
- }
- #include <stdio.h>
-
- int n;
- int arr[20] = {0}, arr_r[20] = {0};
- char crr[10] = {0};
- int lenght = 0;
-
- void func_crr_to_arr()
- {
- for(lenght = 1; crr[lenght-1] != 0 ; lenght++)
- {
- if(crr[lenght-1] >= '0' && crr[lenght-1] <= '9') arr[lenght] = crr[lenght-1] - '0';
- else if(crr[lenght-1] >= 'A' && crr[lenght-1] <= 'F') arr[lenght] = crr[lenght-1] - 'A' + 10;
- }
- lenght -= 1;
- }
-
- int func_arr_palindrome_judge()
- {
- for(int i = 1; i <= lenght ; i++)
- {
- if(arr[i] != arr[lenght - i + 1])
- return 0;
- }
- return 1;
- }
-
- void func_get_arr_reserve()
- {
- for(int i = 1; i <= lenght ; i++)
- {
- arr_r[i] = arr[lenght - i + 1];
- }
- }
-
- void func_arr_reset()
- {
- for(int i = lenght; i > 0; i--)
- {
- if((arr[i] + arr_r[i]) / n != 0 )
- {
- arr[i - 1] ++;
- arr[i] = arr[i] + arr_r[i] - n;
- }
- else
- {
- arr[i] = arr[i] + arr_r[i];
- }
- }
- if(arr[0] != 0)
- {
- for(int i = lenght; i >= 0; i--)
- {
- arr[i + 1] = arr[i];
- }
- arr[0] = 0;
- lenght ++;
- }
- }
-
- int main()
- {
- int step = 0;
-
- scanf("%d", &n);
- scanf("%s", &crr);
- func_crr_to_arr();
-
- while(!func_arr_palindrome_judge())
- {
- func_get_arr_reserve();
- func_arr_reset();
- step ++;
- if(step >= 30)break;
- }
- if(step >= 30)printf("Impossible!");
- else printf("STEP=%d", step);
- return 0;
- }
规律:n=1 --> 3-1,n==2 -->3*3-1 ,n==3 -->3*3-1,n==4-->3*3*3-1
- int main()
- {
- int n;
- while (~scanf("%d", &n))
- {
- int a = 1;
- for (int i = 1; i <= n; i++)
- {
- a *= 3;
- }
-
- printf("%d\n", a - 1);
- }
-
-
- return 0;
- }
- //记住判断素数%2==0就OK了
- #include <stdio.h>
-
- int main()
- {
- int n,a;
- scanf("%d",&n);
- for(int i=0;i<n;i++)
- {
- scanf("%d",&a);
- int count=0;
- for(int j=2;j<a;j++)
- {
- if(a%j ==0)
- {
- count++;
- }
- }
- if(count==0)
- printf("true\n");
- else
- printf("false\n");
- }
-
- return 0;
- }
规律:0、1、1、2、3、5、8、13、21、34、……
- #include <stdio.h>
-
- int fib(int x)
- {
- if(x<=2)
- return x;
- else
- return fib(x-1)+fib(x-2);
- }
- //列如5
- //5->4 3->3 2 1 2->1 2 2 1 2
- //结果1+2+2+1+2 =8
-
- int main()
- {
- int n;
- scanf("%d",&n);
-
- int ret=fib(n);
- printf("%d",ret);
-
- return 0;
- }
- #include <stdio.h>
-
- long long factorial(int n)
- {
- if(n<=2)
- return n;
- else
- return n*factorial(n-1);
- }
-
- int main()
- {
- int n;
- scanf("%d",&n);
-
- long long ret=factorial(n);
- printf("%lld",ret);
-
- return 0;
- }
- #include <stdio.h>
-
- int A(int n,int m)
- {
- if(m==1)
- return n;
- else
- return n*A(n-1,m-1);
- }
- //列如5 4
- //5-1,4-1 -> 4-1,3-1 -> 3-1,2-1
- //4,3 -> 3,2 -> 2,1 return n;
- //n=2,3,4 return n*2*3*4
- //结果:5*4*3*2=120
-
- int main()
- {
- int n,m;
- scanf("%d %d",&n,&m);
-
- int ret=A(n,m);
-
- printf("%d",ret);
-
- return 0;
- }

- void reverse(int a)
- {
- if(a>0)
- {
- printf("%d",a%10);
- reverse(a/10);
- }
- }
- main()
- {
- int a=0;
- scanf("%d",&a);
- reverse(a);
- }
最后希望大家学有所成!!!!