问题A 幸运数
Description
我们将一个正整数分解成若干个质因数(质数因子)的乘积,若得到的质因数的个数也为质数,则称这个整数为幸运数。例如 12 = 2 × 2 × 3,它有 3 个质因数,分别是 2、2、3,而 3 也是质数,所以 12 是一个幸运数;210 不是一个幸运数,因为 210 = 2 × 3 × 5 × 7,它有 4 个质因数,分别是 2、3、5、7,而 4 不是质数。
现在,请你编程求:不大于 n 的所有幸运数。
Format
Input
输入一行一个整数 n。
Output
若干行,每行一个幸运数。要求按照从小到大的顺序输出。
Samples
Sample Input 1
12
Sample Output 1
4
6
8
9
10
12
Limitation
对于 50% 的数据,n ≤ 1000;
对于 80% 的数据,n ≤ 10000;
对于 100% 的数据,2 ≤ n ≤ 100000。
#include<bits/stdc++.h>
using namespace std;
const int maxx=1e5+15;
long long n,a[100005],b;
int main()
{
a[0]=1;
a[1]=1;
for(register int i=2;i<=sqrt(maxx);++i)
{
for(register int j=i+i;j<=maxx;j+=i)
{
a[j]=1;
}
}
cin>>n;
for(register int i=4;i<=n;++i)
{
if(a[i]==1)
{
int num=i,num2=0;
for(int j=2;num!=1;)
{
if(num%j==0) num/=j,num2++;
else
{
while(num%j!=0) j++;
}
}
if(a[num2]==0) cout<<i<<endl;
}
}
return 0;
}
问题B 字符串展开
Description
对于一个字符串,如果其中含有类似于“d - h”或者“4 - 8”的字符子串,我们就把它当作一种简写。还原输出此字符串时,用连续递增的字母或数字串替代其中的减号。上面两个子串分别输出为“defgh” 和 “45678”。具体约定如下:
(1)遇到下面的情况需要对字符串进行展开:在输入的字符串中,出现了减号 “-”,减号两侧同为小写字母或同为数字,且按照 ASCII 码的顺序,减号右边的字符严格大于左边的字符。
(2)如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:“d - e” 应输出为 “de”,“3 - 4”应输出为 “34”。如果减号右边的字符按照 ASCII码的顺序小于或等于左边字符,输出时,要保留中间的减号,例如:“d - d” 应输出为 “d - d”,“3 - 1” 应输出为“3 - 1”。
现在,输入一个字符串,请将此字符串展开输出。
Format
Input
输入一行一个字符串,长度不超过 200,仅由数字、小写字母和减号 “-” 组成。行首和行末均无多余空格。
Output
输出一行一个字符串,为展开后的字符串。
Samples
Sample Input 1
abcs-w-y1234-9s-4zz
Sample Output 1
abcstuvwxy123456789s-4zz
#include<bits/stdc++.h>
using namespace std;
string s;
int main()
{
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]!='-')
{
cout<<s[i];
}
if(s[i]=='-')
{
if(s[i-