牛客网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形图案

#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时。

2. 圣诞树

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);

一维数组

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;
}

4.序列中删除指定数字

#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]);
            }
        }
    }
    

5.序列中整数去重

#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;
}

二维数组

6.回型矩阵

#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; 
}

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. 除去上面四种的边界情况,就是在边界中间的右上移动
#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;
}

字符/字符数组

8.简写单词

#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;
}

函数

9.牛牛的素数和

//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;
}

10.素数回文

#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;
}

11.#[NOIP1999]回文数#

#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;
}

12.汉罗塔问题

规律: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;
}

13.牛牛的素数判断

//记住判断素数%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;
}

递归函数

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

规律: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;
}

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

#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;
}

15.牛牛的排列数

#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;
}

 16.逆序输出

void reverse(int a)
{
    if(a>0)
    {
        printf("%d",a%10);
        reverse(a/10);
    }
}
main()
{
    int a=0;
    scanf("%d",&a);
    reverse(a);
}

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

猜你喜欢

转载自blog.csdn.net/includeevey/article/details/125409113