SDNU 1427.分解质因数(水题)
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; }