刷题3

45 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情


题目描述

点击直达题目链接 在这里插入图片描述

解题思路

第一步:求出所有小于等于n的素数 第二步:依次判断相邻的素数之间相差2,同时进行计数

代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
int main()
{
	int n,i,j;
	scanf("%d", &n);
	int* arr = (int*)malloc(n * sizeof(int));
	assert(arr);
	int a = 0,count=0;
	//判断素数并且储存素数
	//下面这个是求素数的方法
	for (i=2;i<=n;i++)
	{
		for (j = 2; j<= (int)sqrt(i); j++)
		{
			if (i % j == 0)
				break;
		}
		if (j > (int)sqrt(i))
			arr[a++] = i;
	}
	//判断相差2
	for (i = 0; i < a; i++)
	{
		if (arr[i + 1] - arr[i] == 2)
			count++;
	}
	free(arr);
	arr = NULL;
	printf("%d", count);

	return 0;
}

题目描述

题目直达链接 在这里插入图片描述

思路

这个题很简单,百位上是几,就输出一个B;十位上是几,就输出几个S;个位是几,就输出1到几。 我们用这个数%10的各个数放在数组中,然后输出就行了。

代码

#include <stdio.h>

int main()
{
	int n=0,i=0,b=0;
	int arr[3]={0};
	scanf("%d", &n);
	while (n)//获得n的每一位
	{
		arr[i] = n % 10;
		n /= 10;
		i++;
	}
	while (i!=-1)//保证0也可以
	{
		switch (i)
		{
		case 2:
			while (arr[i])
			{
				printf("B");
				arr[i]--;
			}
			break;
		case 1:
			while (arr[i])
			{
				printf("S");
				arr[i]--;
			}
			break;
		case 0:
			for (b = 1; b <= arr[i]; b++)
				printf("%d", b);
			break;
		}
		i--;
	} 
	return 0;
}

题目描述

点击直达题目链接 在这里插入图片描述

解题思路

本题方法较多,博主就讲一个做法。

首先题目要求是不能使用另一个数组。 我们每次都右移一个数字,在右移的开始前,先保存最右边的数字,然后进行覆盖,最后把保存的数字再覆盖给首元素,这是第一次右移。后面的每一次都是这样实现的,可以递归实现。

在这里插入图片描述 还有一个思路:1.全部逆序,2.前面n个逆序,剩余后面的逆序。 读者自己实现一下,用库函数更简单一些

代码

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void f(int* arr,int m,int n)
{
	int temp = arr[m-1];
	int i = 0;
	if (n == 0)
		return;
	for (i = m; i >0; i--)//从后往前覆盖
	{
		arr[i-1] = arr[i -2];
	}
	arr[0] = temp;//让最后一个回到第一个位置
	f(arr, m, n-1);//下一次右移
}
int main()
{
	int m, n;
	scanf("%d%d", &m, &n);
	int* arr = (int*)malloc(m * sizeof(int));
	assert(arr);
	int i = 0;
	for (i = 0; i < m; i++)
	{
		scanf("%d", arr + i);
	}
	f(arr,m, n);
	for (i = 0; i < m; i++)
	{
		printf("%d", arr[i]);
		if (i != m - 1)
			printf(" ");
	}
	free(arr);
	arr = NULL;
	return 0;
}