c语言的一些小题目(初阶),持续分享......

文章目录

1.打印杨辉三角形

2.打印X形图案

3.打印菱形

4.字符串左旋

5.倒置字符串

6.字符串旋转结果

文章内容

1.杨辉三角形是一道非常经典的题目,观察下面的图片中红色与蓝色方块的关系我们不难发现,两个红色方框里的数字相加等于蓝色方框里的数字,找到这种规律我们就可以下手写代码了,需要注意的是第一列和第一行还有第二行都是1。

 代码如下:

int main()
{
    int arr[10][10] = { 0 };//c语言中没有变长数组所以我们使用一个固定的数组
    int i = 0;
    for (i = 0; i < 10; i++)//i为行数 j为列
    {
        int j = 0;
        for (j = 0; j <= i; j++)
        {
            if (i == j || j == 0)//所有为1的地方
                arr[i][j] = 1;

            if (i >= 2 && j >= 1)//这是我们发现的规律
            {
                arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
            }
        }
    }
    for (i = 0; i < 10; i++)//这里我们要打印出来杨辉三角形
    {
        int j = 0;
        for (j = 0; j <= i; j++)//只打印我们给值的地方
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

2.x形状团比杨辉三角形简单,我们需要发现其中的规律,行数和列数相等的时候有*号(主对角线),或者行数加列数等与我们要求的总行数-1。(我们上述讨论的行数和列数都是从0开始的)

 代码如下:

int main()
{
	int n = 0;
	while (scanf("%d", &n) == 1)
	{
		int i = 0;
		int j = 0;
		for (i = 0; i< n;i++)
		{
			for (j = 0; j < n; j++)
			{
				if (i == j || i + j == n - 1)
				{
					printf("*");
				}
				else
				{
					printf(" ");
				}
				
			}
			printf("\n");
		}

	}

	return 0;
}

3.打印菱形分为上半部分和下半部分,当我们输入要打印多少行的时候,上半部分就会打印多少行,下半部分就是行数减一,我们观察 到第0行✳  第1行✳ ........与行数的关系是2*行数+1(行数是从第零行开始的,列数也是从第0行开始的),其次我们可以看出空格随着行数增加时单调递减到我们打印的那一行,便没有空格了,第0行打印7个空格,第八行打印0个空格,可以得出空格与行数的关系时 我们要打印的 行数-1-第几行。

打印下半部分的空格较为简单,但是打印✳的关系不太好找,但仔细观察后我们可以发现是2*(行数-1-第几行)-1。

 代码如下;

#include <stdio.h>
int main()
{
	int line = 0;
	scanf("%d", &line);//7
	//上
	int i = 0;
	for (i = 0; i < line; i++)
	{
		//打印一行
		//打印空格
		int j = 0;
		for (j=0; j<line-1-i; j++)
		{
			printf(" ");
		}
		//打印*
		for (j = 0; j < 2*i+1; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	//下
	for (i = 0; i < line-1; i++)
	{
		//打印一行
		//打印空格
		int j = 0;
		for (j = 0; j <= i; j++)
		{
			printf(" ");
		}
		//打印*
		for (j = 0; j < 2*(line-1-i)-1; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

4.字符串左旋

题目:

实现一个函数,可以左旋字符串中的k个字符。

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

这种题目是我们首先要输入一个字符串,然后我们要决定从第几个字符串开始左旋。

思路:我们可以把从第几个字符开始左旋之前的分为一部分,之后的分为一部分。分别逆序这两部分,然后再将整体的字符串逆序。

代码如下。

void reverse(char* arr, int i, int j)
{
	while (i < j)
	{
		char tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
		i++;
		j--;
	}

}

void leftRound(char* arr,int time)
{
	int len = strlen(arr);
	int mid = time % len;

	reverse(arr , 0, mid-1);
	reverse(arr, mid, len-1);
	reverse(arr, 0, len-1);
}

int main()
{
	char arr[50] = {0};
	gets(arr);


	int n = 0;
	scanf("%d",&n);
	leftRound(arr,n);

	printf("%s\n",arr);

	return 0;
}

5.倒置字符串

题目:将一句话的单词进行倒置,标点不倒置。比如 "I like beijing.",经过处理后变为:"beijing. like I"。字符串长度不超过100。

这个题的思路跟上一题基本类似,都是将部分逆序,再将整体逆序,不同之处在于这一题要如何来判定每一部分,题目中每一部分的结束是空格,最后是’\0‘。

代码:

#include <stdio.h>
void reverse(char* left, char* right)
{
    while (left < right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}

//函数逆序字符串
int main() {
    char arr[101] = {0};
    gets(arr);//读取一个字符串,即使中间有空格
    int len = strlen(arr);
    reverse(arr, arr + len - 1);
    //逆序每个单词
    char* start = arr;
    char* cur = arr;

    while (*cur)//"\0"的ascii 为0
 {
        while (*cur != ' ' && *cur != '\0')//等与空格或者‘\0’开始逆序或者跳出循环
        {
            cur++;
        }
        reverse(start, cur - 1);
        start = cur + 1;
        if (*cur == ' ')//只有当*cur为空格的时候才++,为"\0"跳出循环
            cur++;
    }
    printf("%s\n", arr);
    return 0;
}

6.字符串旋转结果

题目 :写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 =AABCD和s2 = BCDAA,返回1

给定s1=abcd和s2=ACBD,返回0

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

我们仔细观察可以发现如果一个字符串是另一个字符串旋转过后的结果的话,我们无论将原来的字符串 或者旋转过后的字符串 复制一份跟在这个字符串的后面都可以发现一下规律。

AABCD左旋一个字符得到ABCDA               AABCDAABCD两倍原字符串,找到旋转后的字符串。

AABCD左旋两个字符得到BCDAA              BCDAABCDAA两倍旋转后的字符串,找到原字符串。

有了以上的规律便不难写代码了,代码如下。

关于strstr用法这篇文章讲过了http://t.csdn.cn/5XKJ2

#include <stdio.h>

int findRound(const char* src, char* find)
{
	char tmp[256] = { 0 }; //用一个辅助空间将原字符串做成两倍原字符串
	strcpy(tmp, src); //先拷贝一遍
	strcat(tmp, src); //再连接一遍
	return strstr(tmp, find) != NULL; //看看找不找得到
}

int main()
{
	char arr[50];
	gets(arr);

	char arr1[50];
	gets(arr1);

	int ret = findRound(arr, arr1);

	if (ret == 1)
	{
		printf("%d\n",ret);
	}

	else
	{
		printf("%d\n",ret);
	}
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值