携手创作,共同成长!这是我参与「掘金日新计划 · 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;
}