1、线段相交
const double eps = 1e-8;
int sgn (double x) {
if(fabs(x) < eps) return 0;
if(x < 0) return -1;
else return 1;
}
struct Point {
double x, y;
Point(){}
Point(double xx, double yy): x(xx), y (yy) {}
Point operator - (const Point &p) const {
return Point(x - p.x, y - p.y);
}
double operator ^ (const Point &p) const { //判向量上侧、下侧 >0 P在上侧
return x*p.y - y*p.x;
}
double operator * (const Point &p) const { // 判向量夹角角度
return x*p.x + y*p.y;
}
};
struct Line{
Point s, e;
Line(){}
Line(Point _s, Point _e): s(_s), e(_e){}
};
bool inter(Line l1, Line l2) {
return max(l1.s.x, l1.e.x) >= min(l2.s.x, l2.e.x) &&
max(l2.s.x, l2.e.x) >= min(l1.s.x, l1.e.x) &&
max(l1.s.y, l1.e.y) >= min(l2.s.y, l2.e.y) &&
max(l2.s.y, l2.e.y) >= min(l1.s.y, l1.e.y) &&
sgn((l2.s - l1.s)^ (l1.e - l1.s)) * sgn((l2.e-l1.s) ^ (l1.e - l1.s)) <= 0 &&
sgn((l1.s - l2.s)^ (l2.e - l2.s)) * sgn((l1.e-l2.s) ^ (l2.e - l2.s)) <= 0;
}
2、素筛和唯一分解
const int maxn = 10100;
int prime[maxn];
bool vis[maxn];
int numm = 0;
void init_prime() {
numm = 0;
memset(prime, 0, sizeof(prime));
memset(vis, true, sizeof(vis));
for (int i = 2; i< maxn; i++) {
if(vis[i]) {
prime[numm] = i;
numm += 1;
for (int j = i*i; j < maxn; j += i) {
vis[j] = false;
}
}
}
return ;
}
int s[maxn];
int cnt;
void solve(int a) {
cnt = 0;
for (int i = 0; prime[i] <= a; i++) {
int pri = prime[i];
if(a % pri == 0) {
int num = 0;
while(a % pri == 0) {
num ++;
a /= pri;
}
s[cnt ++] = pri;
}
}
}
int main() {
init_prime();
int a;
while(cin >> a) {
memset(s, 0, sizeof(s));
solve(a);
for (int i = 0; i < cnt; i++) {
cout << s[i] << endl;
}
}
system("pause");
return 0;
}