【PAT乙】B1007/B1013/B1017

22 篇文章 0 订阅
//今天就刷了三题,感觉挺顺利的,继续保持。
/*
*时间:2018年4月13日08:22:04-2018年4月13日08:45:20
*题号:1007. 素数对猜想
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:
让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1
有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。

输入格式:每个测试输入包含1个测试用例,给出正整数N。

输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。
输入样例:

20

输出样例:

4
*/
//思路,这题题目还是很直观的,i是素数,i+2也是素数就满足一个素数对,但是也有其他一些约束
//这题不能直接去遍历所有的数,特别是在判断素数的时候,对除数要开平方,不然速度太慢
#include <iostream>
using namespace std;
#define Debug false
#include <math.h>
bool isSUSHU(int a)//判断是否为素数
{
	int sqr = (int)sqrt(1.0 * a);//这里有个小技巧,大大加快速度,不然最后一个点过不去
	for (int i=2; i<=sqr; i++)
	{
		if (a%i == 0)
			return false;
	}
	return true;
}

int main()
{
	int num;
	cin>>num;
	int sushudui = 0;
	for (int i=1; i<num; i+=2)//题目说了dn是为偶数,那么素数一定是奇数(这不是常识吗,傻逼了)
	{						  //不需要遍历每个数,把所有的奇数遍历了就满足了,也可以加快一倍的速度
		if(Debug) cout<<isSUSHU(i);
		if (i != 1 && isSUSHU(i) && isSUSHU(i+2) && i+2<=num)//要保证i+2<=num
			sushudui++;
	}
	cout<<sushudui;
	return 0;
}



/*
*时间:2018年4月13日21:29:16-2018年4月13日21:46:57
*题号:1013. 数素数
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:
令Pi表示第i个素数。现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数。

输入格式:

输入在一行中给出M和N,其间以空格分隔。

输出格式:

输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。
输入样例:

5 27

输出样例:

11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
*/
//思路:这题的判断方法和之前是差不多的,判断素数的时候的技巧。
//我是把第一个到第N个素数都压进了一个容器里,容器下表即第几个素数。
//之后把第M个到第N个素数打印出来即可
#include <iostream>
using namespace std;
#define Debug false
#include <math.h>
#include <vector>
bool isSUSHU(int a)//判断是否为素数
{
	int sqr = (int)sqrt(1.0 * a);//这里有个小技巧,大大加快速度,不然最后一个点过不去
	for (int i=2; i<=sqr; i++)
	{
		if (a%i == 0)
			return false;
	}
	return true;
}

int main()
{
	int M, N;
	cin>>M>>N;
	vector<int> v;//装素数的容器
	int num = 0;
	int i = 2;
	while(num != N)//对1开始每个每个数判断是否为素数,是的话就压进容器,当然可以从1=1开始用i+=2会更好
	{
		if(Debug) cout<<isSUSHU(i);
		if (isSUSHU(i))
		{
			v.push_back(i);//判断为素数就压进容器
			num++;//当前是第num个素数
		}	
		i++;	
	}		
	for (int i=M, j=1; i<=N; i++)//输出素数,当然要按着输出的格式
	{
		if (i == N) 
		{
			cout<<v[N-1];//第i个素数对应的下边是i-1
			break;//最后一个输出完之后就跳出循环,免得刚好是第十个又输出回车了
		}
		else if (j%10 == 0) cout<<v[i-1]<<endl;//每十个要加回车,而且末尾不能有空格
		else cout<<v[i-1]<<" ";
		j++;
	}
	return 0;
}



/*
*时间:2018年4月13日21:57:15-2018年4月13日22:22:33
*题号:B1017. A除以B
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:
本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,
使得A = B * Q + R成立。

输入格式:

输入在1行中依次给出A和B,中间以1空格分隔。

输出格式:

在1行中依次输出Q和R,中间以1空格分隔。
输入样例:

123456789050987654321 7

输出样例:

17636684150141093474 3

*/
//思路:这题还是写的比较满意的,就20行左右的代码解决了一个书上40多行代码的问题,而且一次AC
//用小学学过的除法法则,对于被除数的高位开始依次除以除数(这里除数是各位数比较好处理)
//除下来的余数*10+下一位的数再除以除数,直到被除数每一位除尽。
#include <iostream>
using namespace std;
#include <vector>
#include <string.h>
int main()
{
	string A;
	int B;
	cin>>A>>B;
	int lenA = A.size();
	vector<int> v;//用来存放商的结果
	int left = 0;
	for(int i=0; i<lenA; i++)
	{
		v.push_back((left * 10 + (A[i] - '0')) / B);//每一位除了的结果压入容器
		left = (left * 10 + (A[i] - '0')) % B;//除了之后的余数
	}
	int len = v.size();
	for (int i=0; i<len; i++)
	{
		if(i==0 && v[0] == 0 && len > 1) continue;//如果第一位为0,而且商的结尾大于1位,则跳过第一位
		else if (i==0 && v[0] == 0 && len == 1) cout<<"0";//如果商就为0,这里好像不加也没关系哦
		else cout<<v[i];
	}
	cout<<" "<<left;//空格在这里打印比较方便,再打印余数
	return 0;
}	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值