文章目录
1.打印杨辉三角形
2.打印X形图案
3.打印菱形
4.字符串左旋
5.倒置字符串
文章内容
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;
}