2019.2.14目标院校初试分数公布的时间延后了两天emmm
1007#素数对猜想#
这道题我开始求素数是用的二重循环,判断素数对是把先求出的素数存入temp,然后第二个求出的素数减去temp,如果是2,k++。但是这种算法时间消耗太大,下面的代码是最开始的版本(会有一个测试点的错误):
#include <iostream>
using namespace std;
int main()
{
int x, i, j, flag = 0, h = 0, k = 0, qian = 0, temp = 0;
cin >> x;
for (i = 2; i <= x;i++)
{
flag = 0;
for (j = 1; j < i;j++)
{
if((i%j==0)&&(j!=1))
{
flag = 1;j=i;
}
}
if (flag == 0)
{
temp = i-qian;
if (temp == 2)
{
k++;
}
qian = i;
h++;
}
}
cout << k-1;
system("pause");
return 0;
}
下面的代码是改进的版本,就是算一个数是否是素数时,不用一直循环到自身,而是到这个数开根号项,代码如下:
#include<stdio.h>
#include<math.h>
int issus(int x)
{
int j,t;
t=(int)sqrt((double)x);
for(j=2;j<=t;j++)
{
if(x%j==0)
return 0;
}
if(j>t)
return 1;
}
int main()
{
int i,k=0,n;
scanf("%d",&n);
for(i=3;i<n-1;i++)
{
if(issus(i) && issus(i+2))
k++;
}
printf("%d\n",k);
return 0;
}
总结
(1)数组初始化必须定义有几个
(2)段错误:非法访问内存,比如你通过指针去改变一个代码区,系统区的内存上的值,就会段错误。用指针一定要知道所指的地方可以做什么,不然很容易出现段错误
(3)intfree大虾的最后一个不到10s的程序,据他说用了容斥原理
1008#数组元素循环右移问题#
这道题还是比较基础的,只需要写个倒置函数,分三次倒置,第一次是整体全倒置,第二次是第一个数到第M(M是向右移几位)个数倒置,第三次是第M+1到最后的数倒置。
特别注意:M不一定是小于N(输入数的总数)的,所以要把M%N赋值给M,不然会有两个测试点的错误!
#include<iostream>
using namespace std;
int a[101] = { 0 };
void reverse(int qian, int hou)
{
int temp = 0;
for (int j = 0; j <( (hou-qian) + 1)/2; j++)
{
temp = a[qian+j-1];
a[qian+j-1] = a[hou-j-1];
a[hou-j-1] = temp;
}
}
int main()
{
int sum, r;
cin >> sum;
cin >> r;
r = r%sum;
for (int i = 0; i < sum;i++)
{
cin >> a[i];
}
reverse(1,sum);
reverse(1,r);
reverse(r+1,sum);
for (int i = 0; i < sum-1; i++)
{
cout<< a[i]<<" ";
}
cout << a[sum - 1];
system("pause");
return 0;
}