编程100题(5)

判断回文字符串

题目描述:

输⼊⼀个字符串,判断这个字符串是否是回⽂字符串(字符串的⻓度⼩于等于30,字符串不包含空
格),如果是回⽂字符串输出Yes,如果不是回⽂字符串输出No。
测试1:
输⼊:abcdef
输出:No
测试2:
输⼊:abccba
输出:Yes
测试3:
输⼊:abcba
输出:Yes
测试4:
输⼊:a
输出:Yes

思路:

  1. 计算字符串长度
  2. i=0;j=len-1
  3. while循环,循环判断条件为i<j
  4. 嵌套if语句判断str[i] == str[j]
  5. 若相等则i++;j - -;接着循环,若不相等则将flag置为1并直接退出循环
  6. 循环结束若flag==0则表示是回文字符串,若不是则相反
#include<stdio.h>
#include<string.h>

int main()
{
	char str[30] = "";
	scanf("%s",str);
	int len = strlen(str);
	int i = 0;
	int j = len-1;
	int flag = 0;
	while (i < j)
	{
		if (str[i] != str[j])
		{
			flag = 1;
			break;
		}
		i++;
		j--;
	}
	if (flag == 0)
	{
		printf("Yes\n");
	}
	else
	{
		printf("No\n");
	}
	return 0;
}

在这里插入图片描述

计算天数

题⽬描述:

输⼊y和m两个整数,y表⽰年份,m表⽰⽉份,计算y年m⽉有多少天,并输出天数。
测试1:
输⼊:2023 4
输出:30
测试2:
输⼊:2023 2
输出:28
测试3:
输⼊:2020 2
输出:29

思路:

  1. 创建两个int类型的数组分别表示闰年每月天数以及非闰年每月天数
  2. 判断年份是否为闰年
#include<stdio.h>

int main()
{
	int y = 0;
	int m = 0;
	scanf("%d %d",&y,&m);
	int arr1[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	int arr2[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
	{
		printf("%d\n",arr1[m]);
	}
	else
	{
		printf("%d\n",arr2[m]);
	}
	return 0;
}

在这里插入图片描述

删除指定的数

题⽬描述:

先输⼊10个整数存放在数组中,再输⼊⼀个整数n,删除数组中所有等于n的数字,数组中剩余的数
组保证数组的最前⾯,打印剩余的数字。
测试1:
输⼊:
1 2 3 4 5 4 5 6 1 6
4
输出:
1 2 3 5 5 6 1 6
测试2:
输⼊:
1 2 3 4 5 6 7 8 9 10
17
输出:
1 2 3 4 5 6 7 8 9 10

思路:

  1. 最外层for循环判断循环执行次数
  2. 判断arr[i]==n,若相等则再嵌套一层for循环表示交换次数,将后面的数字换到前面,与n相等的数字换到最后,再将len - -;i - -;i也需要 - -是因为原本arr[i]被换成原本arr[i+1]的数,还未与n进行比较
  3. 输出
#include<stdio.h>

int main()
{
	int arr[10] = { 0 };
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		scanf("%d",&arr[i]);
	}
	int n = 0;
	scanf("%d",&n);
	int len = 10;
	for (i = 0; i < len; i++)
	{
		int j = 0;
		int tmp = 0;
		if (arr[i] == n)
		{
			for (j = i; j < len; j++)
			{
				arr[j] = arr[j + 1];
			}
			len--;
			i--;
		}
	}
	for (i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

在这里插入图片描述

字符串拷贝

题⽬描述:

写⼀个函数my_strcpy,实现拷⻉字符串的功能,假设给定⼀个字符数组a,再给定⼀个字符数组
b,将字符串a中的内容拷⻉到字符串b中,拷⻉内容包含字符串末尾的 \0 字符。

思路:

  1. 注意传址而不是传址;
  2. 当a中没字符时直接输出b即可,当a中有字符时,只要 * dst = * src即可,再利用++将地址往后遍历;最后再循环退出会将*dst=’\0‘即可
#include<stdio.h>
#include<assert.h>

char* my_strcmp(char* dst, char* src)
{
	char* tmp = dst;
	assert(dst && src);
	if (*src == '\0')
	{
		return tmp;
	}
	while (*src != '\0')
	{
		*dst = *src;
		dst++;
		src++;
	}
	*dst = '\0';
	return tmp;
}

int main()
{
	char a[] = "abcfr";
	char b[100] = "aaaaaaaaaa";
	char* str=my_strcmp(&b,&a);
	printf("%s\n",str);
	return 0;
}

在这里插入图片描述

合并有序数组

题⽬描述:

输⼊两个升序排列的序列,将两个序列合并为⼀个有序序列并输出。
输⼊包含三⾏,第⼀⾏包含两个正整数n, m,⽤空格分隔。n表⽰第⼆⾏第⼀个升序序列中数字的个
数,m表⽰第三⾏第⼆个升序序列中数字的个数。其中
1<=n<=30, 1<=m<=30 第⼆⾏包含 n 个整数,⽤空格分隔。
第三⾏包含 m 个整数,⽤空格分隔。
输出为⼀⾏,输出⻓度为n+m的升序序列,即⻓度为n的升序序列和⻓度为m的升序序列中的元素重
新进⾏升序序列排列合并。
测试:
输⼊:
5 6
1 3 7 9 22
2 8 10 17 33 44
输出:
1 2 3 7 8 9 10 17 22 33 44

思路:

  1. 创建3个数组,分别存放输出的两组数据以及最后的输出数组;
  2. 最外层while循环,判断 i<n,j<m
  3. 嵌套if循环,对前两组数据进行比较,小的存放入第三个数组,再将小的数组下标与k++;若相等则分别放入arr3[k]和arr3[k+1]中,k需要+2,其余下标++;
  4. 退出循环后判断arr1和arr2中的数据是否都进行存放,将未进行存放的数据进行存放后即可进行最后的打印输出
#include<stdio.h>

int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d",&n,&m);
	int arr1[30] = { 0 };
	int arr2[30] = { 0 };
	int arr3[60] = { 0 };
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		scanf("%d",&arr1[i]);
	}
	for (i = 0; i < m; i++)
	{
		scanf("%d", &arr2[i]);
	}
	i = 0;
	int k = 0;
	while (i < n && j < m)
	{
		if (arr1[i]>arr2[j])
		{
			arr3[k] = arr2[j];
			k++;
			j++;
		}
		else if (arr2[j]>arr1[i])
		{
			arr3[k] = arr1[i];
			i++;
			k++;
		}
		else
		{
			arr3[k] = arr1[i];
			arr3[k + 1] = arr2[j];
			i++;
			j++;
			k += 2;
		}
	}
	if (i < n)
	{
		while (i < n)
		{
			arr3[k] = arr1[i];
			k++;
			i++;
		}
	}
	else if (j < m)
	{
		while (j<m)
		{
			arr3[k] = arr2[j];
			k++;
			j++;
		}
	}
	for (i = 0; i <k; i++)
	{
		printf("%d ",arr3[i]);
	}
	printf("\n");
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值