1007 素数对猜想 1008 数组元素循环右移问题
算法,很奇妙吧
王道的基础c课看完了,之后就是正儿八经的数据结构了。
1007 素数对猜想
让我们定义d**n为:d**n=p**n+1−p**n,其中p**i是第i个素数。显然有d1=1,且对于n>1有d**n是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
题解(1)超时了:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int N;
scanf("%d", &N);
int* p;
int num = 0;
int flag = 0;
p=(int *) malloc(400000);
for (int i = 2; i <= N; i++)
{
int j = 2;
for (; j < i; j++)
{
if (i % j != 0)
{
}
else
{
break;
}
}
if (j == i)
{
*(p+num) = j;
num += 1;
}
}
for (int i = 0; i < num; i++)
{
if (*(p + i) == *(p + i + 1) - 2)
{
flag++;
}
}
printf("%d", flag);
}
题解:
#include<stdio.h>
int main()
{
int N;
scanf("%d", &N);
int* p;
int num = 0;
int flag = 0;
int a = 3;
int b = 3;
for (int i = 5; i <= N; i += 2)
{
int f = 1;
for (int j = 2; j * j <=i; j++)//这个等号重要
if (i % j == 0)
{
f = 0;
break;
}
if (f)
{
b = i;
if (a == b - 2)
{
flag++;
}
a = b;
}
}
printf("%d", flag);
}
总结:
昨天刚学的malloc,今天就用了,真是有成就感啊。
然后就超时了。
首先发现malloc是需要多引入一个头文件的
#include<stdlib.h>
然后就是这题的两个优化点。
- 找素数。这题的题意是找两个差值为2的素数组,首要任务是找素数。一开始我用遍历一个一个除,结果快乐超时。找到了一个定理,只需要除到这个数本身开方,就可以判断是否为素数了。使用后不超时。
- 接找素数。有一个等号很重要,写注释了。要可以等于开方后本身,因为可以开方的数一定不是素数(这不废话吗
- 压根不需要存到数组里,只需要存两个相邻素数,差值为2时计数+1即可。
1008 数组元素循环右移问题
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯A**N−1)变换为(A**N−M⋯A**N−1A0A1⋯A**N−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
题解:
#include<stdio.h>
#include<stdlib.h>
int reverse(int *p, int sum)
{
for (int i = 0; i < sum / 2; i++)
{
int temp;
temp = p[i];
p[i] = p[sum - i- 1];
p[sum - i- 1] = temp;
}
}
int main()
{
int sum, remove;
scanf("%d", &sum);
scanf("%d", &remove);
int* p = (int*) malloc(sum * sizeof(int));
for (int i = 0; i < sum; i++)
{
scanf("%d", &*(p + i));
}
remove = remove % sum;
reverse(p, sum-remove);
reverse(p + sum-remove, remove);
reverse(p, sum);
for (int i = 0; i < sum; i++)
{
if (i != sum - 1)
{
printf("%d ", *(p + i));
}
else
{
printf("%d", *(p + i));
}
}
}
总结:
第一眼以为使用指针做的,昨天刚学的指针,今天就用上了,真是好有成就感啊!
指针做不出来。
查了半天,知道了这个几次逆序的方法,真是奇妙啊。看了篇博客,写的真好
| 逆序解决右移问题 | https://www.cnblogs.com/TomHe789/archive/2020/03/01/12390412.html |
|---|

浙公网安备 33010602011771号