判断回文字符串
题目描述:
输⼊⼀个字符串,判断这个字符串是否是回⽂字符串(字符串的⻓度⼩于等于30,字符串不包含空
格),如果是回⽂字符串输出Yes,如果不是回⽂字符串输出No。
测试1:
输⼊:abcdef
输出:No
测试2:
输⼊:abccba
输出:Yes
测试3:
输⼊:abcba
输出:Yes
测试4:
输⼊:a
输出:Yes
思路:
- 计算字符串长度
- i=0;j=len-1
- while循环,循环判断条件为i<j
- 嵌套if语句判断str[i] == str[j]
- 若相等则i++;j - -;接着循环,若不相等则将flag置为1并直接退出循环
- 循环结束若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
思路:
- 创建两个int类型的数组分别表示闰年每月天数以及非闰年每月天数
- 判断年份是否为闰年
#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
思路:
- 最外层for循环判断循环执行次数
- 判断arr[i]==n,若相等则再嵌套一层for循环表示交换次数,将后面的数字换到前面,与n相等的数字换到最后,再将len - -;i - -;i也需要 - -是因为原本arr[i]被换成原本arr[i+1]的数,还未与n进行比较
- 输出
#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 字符。
思路:
- 注意传址而不是传址;
- 当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
思路:
- 创建3个数组,分别存放输出的两组数据以及最后的输出数组;
- 最外层while循环,判断 i<n,j<m
- 嵌套if循环,对前两组数据进行比较,小的存放入第三个数组,再将小的数组下标与k++;若相等则分别放入arr3[k]和arr3[k+1]中,k需要+2,其余下标++;
- 退出循环后判断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;
}