Description
问题描述 求出区间[a,b]中所有整数的质因数分解。 输入格式 输入两个整数a,b。 输出格式 每行输出一个数的分解,形如k=a1*a2*a3...(a1< =a2< =a3...,k也是从小到大的)(具体可看样例) 样例输入 3 10 样例输出 3=3 4=2*2 5=5 6=2*3 7=7 8=2*2*2 9=3*3 10=2*5 提示 先筛出所有素数,然后再分解。 数据规模和约定 2< =a< =b< =10000
Input
Output
Sample Input
Sample Output
思路:明明就是一道水题,debug却让我吐血!一开始我用vector来存数据,但是爆了,也不知道为什么会爆,我明明开了很大的数。后来只能用简化的办法了。
#include <cstdio>
#include <iostream>
#include <cmath>
#include <
string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <map>
using namespace std;
#define ll long long
const int inf =
0x3f3f3f3f;
const int mod = 1e9+
7;
int a, b, tot, pri[
10000+
8], en[
10000+
8];
bool is[
10000+
8];
void E()
{
tot =
0;
memset(is,
1,
sizeof(
is));
is[
0] =
is[
1] =
0;
for(
int i =
2; i<
10000+
8; i++
)
{
if(
is[i])
{
pri[tot++] =
i;
for(
int j = i+i; j<
10000+
8; j +=
i)
is[j] =
0;
}
}
}
int main()
{
E();
while(~scanf(
"%d%d", &a, &
b))
{
for(
int i = a; i <= b; i++
)
{
int id =
0, buffer =
i;
for(
int j =
0; j < tot && pri[j]*pri[j] <= i; j++
)
{
if(buffer%pri[j] ==
0)
{
while(buffer%pri[j] ==
0)
{
en[id++] =
pri[j];
buffer /=
pri[j];
}
}
}
if(buffer>
1)en[id++] =
buffer;
printf("%d=", i);
bool flag =
0;
for(
int j =
0; j<id; j++
)
{
if(flag)printf(
"*");
flag =
1;
printf("%d", en[j]);
}
printf("\n");
}
}
return 0;
}
转载于:https://www.cnblogs.com/RootVount/p/11252860.html
相关资源:JAVA上百实例源码以及开源项目