PAT1006(15分)
太简单了……贴代码
#include <iostream>
#include<string>
#include<cstdlib>
using namespace std;
int main()
{
char m[10] = { '0','1','2','3','4','5','6','7','8','9'};
int num; string a;
int i =1;
cin >> num;
//int h,t;
string ans;
while (num - 100 >= 0)
{
ans += 'B';
num -= 100;
//cout << num;
}
while (num - 10 >= 0)
{
ans += 'S';
num -= 10;
}
while (num>0)
{
//a =char(i);
//cout << a;
//cout << i;
ans += m[i];
i++;
num--;
}
cout << ans;
//system("PAUSE");
return 0;
}
呱,第二道题也刷完啦!!
费了点功夫,从14刷到18再到20!嘻嘻!
但是还是优化不够!
这个比较烦的就是找素数……重点就在怎么节省时间来找全素数。
我想的是排除所有偶数及3的倍数,即当i%2==0时跳过这个数 。后来看别人的发现把for循环步长设为2就行了……哈哈哈哈我蠢了!
然后判断是否为素数时,我也选的步长为2,即当前数从5开始,除以5,除以7,除以9……
然而还是最后一个测试点超时了!!!
最后网上找的答案,他们判断选择被除数的方式是,这个被除数的平方小于当前值即可,步长仍为1。这么算确实很快……具体原理我查了一下,只找到了一个结论(总觉得老师讲过这个结论,我全忘了嘻嘻……)
一个数,如果有因子的话,那么在它的平方根数以内就应该有,否则就没有因子。所以必定有一个因子不大于m的平方根。故判断m是否为素数,只要试除到m的平方根就可以了,不必一直到m-1。
其余的就很简单啦!贴代码!
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;
vector<int>prime;
int l = 2;
int is_prime(int a)
{
int j;
for (j = 2; j*j<=a; j++)
{
if (a%j == 0)
return 0;
}
prime.push_back(a);
l++;
if (prime[l] - prime[l-1] == 2)
return 1;
else return 0;
}
int main()
{
int num; cin >> num;
int count = 0;
prime.push_back(1);
prime.push_back(2);
prime.push_back(3);
int i;
if (num <= 4)
{ cout<<"0";
return 0;}
if(num==5)
{
cout<<"1";
return 0;
}
for (i = 5; i<=num; i+=2)
{
if ( i % 3 == 0)
continue;
else
count+=is_prime(i);
}
cout << count;
//system("PAUSE");
}
今天可以按时打卡啦!开熏!!
希望宋宋火车上睡个好觉,嘻嘻!