习题(指针、水仙花数、字符串左旋、杨氏矩阵、打印图形、序列中删除数字)

本文包含一系列C语言编程题目,涉及指针的使用,如数组指针操作;变种水仙花数的计算;字符串左旋的两种实现方式;在杨氏矩阵中查找特定数字的算法;打印空心三角形和X形图案的代码实现;以及从序列中删除指定数字的逻辑处理。这些题目展示了基础算法和数据结构的应用。
摘要由CSDN通过智能技术生成

习题

1.指针

1

int main()
{
	char* a[] = { "work","at","alibaba" };
	char** pa = a;
	pa++;
	printf("%s\n", *pa);
	return 0;
} 

img

int main()
{
	char* c[] = { "ENTER","NEW","POINT","FIRST" };
	char** cp[] = { c + 3,c + 2,c + 1,c };
	char*** cpp = cp;

	printf("%s\n", **++cpp);
	printf("%s\n", *-- * ++cpp + 3);
	printf("%s\n", *cpp[-2] + 3);
	printf("%s\n", cpp[-1][-1] + 1);

	return 0;
} 

img

2.变种水仙花数

变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461)
(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是-Lily Number.

例如:655= 6* 55+ 65 * 5 求出 5位数中的所有 Lily Number.
输入描述:无 输出描述:一 行,5位数中的所有 Lily Number,每两个数之间间隔一个空格

由题意可得:三位数可查分成两组,四位数可拆分成三组,那么五位数即可拆分成四组;

img

#include<math.h>
int main()
{
	int i = 0;
	for (i = 10000; i <= 99999; i++)
	{
		int j = 0;
		int sum = 0;
		for (j = 1; j <= 4; j++)
		{
			int m = i / (int)pow(10, j);
			int n = i % (int)pow(10, j);
			sum += m * n;
		}
		if (sum == i)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

3.字符串左旋

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

例如:abcd左旋一个字符得到dcda

1.左旋1个字符:将第一个字符用tmp接收,然后后面的字符按循序打印,然后再将tmp放在最后。

左旋k个字符:循环k%len

#include<string.h>
void left_move(char arr[], int k)
{
	int len = strlen(arr);
	int j = 0;
	for (j = 0; j < k % len; j++)
	{
		char tmp = arr[0];
		int i = 0;
		for (i = 0; i < len - 1; i++)
		{
			arr[i] = arr[i + 1];
		}
		arr[len - 1] = tmp;
	}
}
int main()
{
	int k = 0;
	scanf("%d", &k);
	char arr[20] = "abcdef";
	left_move(arr, k);
	printf("%s\n", arr);
	return 0;
}

2.逆序思想:第一步,将要左旋的字符逆序;第二步,将不左旋的字符逆序;第三步,将整个字符串逆序。

#include<string.h>
reverse(char* left, char* right)
{
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
void left_move(char arr[], int k)
{
	int len = strlen(arr);
	k = k % len;
	reverse(arr, arr + k - 1);
	reverse(arr + k, arr + len - 1);
	reverse(arr, arr + len - 1);
}
int main()
{
	char arr[20] = "abcdef";
	int k = 0;
	scanf("%d", &k);
	left_move(arr, k);
	printf("%s\n", arr);
	return 0;
}

4.杨氏矩阵

杨氏矩阵:矩阵的每行从左到右递增,每列从上到下递增

在这样的矩阵中查找某个数字是否存在。

因为每一行最后一个数是该行最大的数,如果这个数 < k,那就说明该行所有的数字都小于k,此时应该让下一行最后一个数去和k比较。

每一列最上面的数字是该列最小的数字,如果这个数字 > k,就说明该列所有的数都 > k,此时应该让上一列第一个数去和k比较。

void find_k(int arr[3][3], int k, int r, int c)
{
	int x = 0;
	int y = c - 1;
	while (x<r &&y>=0)
	{
		if (arr[x][y] < k)
		{
			x++;
		}
		else if (arr[x][y] > k)
		{
			y--;
		}
		else
		{
			printf("找到了,下标是:%d %d\n",x,y);
			return 0;
		}
	}
	printf("找不到\n");
}
int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int k = 5;
	int x = 3;
	int y = 3;

	find_k(arr, k, x, y);
	return 0;
}
void find_k(int arr[][4], int k, int* px, int* py)
{
	int x = 0;
	int y = *py - 1;
	int flag = 0;
	while (x < *px && y >= 0)
	{
		if (arr[x][y] < k)
		{
			x++;
		}
		else if (arr[x][y] > k)
		{
			y--;
		}
		else
		{
			*px = x;
			*py = y;
			return 0;
		}
	}
	//找不到
	*px = -1;
	*py = -1;
}
int main()
{
	int arr[2][4] = { 1,2,3,4,5,6,7,8, };
	int k = 5;
	int x = 2;
	int y = 4;

	find_k(arr, k, &x, &y);
	if (x == -1 && y == -1)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了,下标是:%d %d\n", x, y);
	}
	return 0;
}

5.打印空心三角形

//*
//* *
//* *
//* *
//* * * * *

多组输入

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

image-20230516162021732

6. X形图案

输入描述:多组输入,一个整数(2-20),表示输出的行数,也表示组成“X”的正斜线和反斜线的长度

输出描述:针对每行输入,输出用“*”组成的X形图形

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

image-20230516163215205

7.序列中删除指定数字

一个整数序列 (可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列
中未被删除数字的前后位置没有发生改变。
数据范围:序列长度和序列中的值都满足 1≤n≤ 50
输入描述:
第一行输入一个整数(1≤n≤ 50)。
第二行输入n个整数,输入用空格分隔的n个整数,
箪三行输入根要进行删除的一个整数。
输出描述:
输出为一行,删除指定数字之后的序列。

int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[50] = { 0 };
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf("%d ", &arr[i]);
	}
	int del = 0;
	scanf("%d", &del);
	i = 0;//遍历数组
	int j = 0;//记录可以存档数据的当前位置
	for (i = 0; i < n; i++)
	{
		if (arr[i] != del)
		{
			arr[j] = arr[i];
			j++;
		}
	}
	for (i = 0; i < j; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值