PAT(Basic Level) Practice (中文)试题源码及心得(1007~1008)

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;
}

你可能感兴趣的:(PAT(Basic Level) Practice (中文)试题源码及心得(1007~1008))