poj 1365
因式分解,鼓捣一会就出来了,这道题里又学会了sscanf与scanf类比时的不同,sscanf每次读取的都是这个串的从前往后读。
处理整行数据时可以多读取个%c判断c即可判断是否到行结束
//============================================================================ // Name : poj.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include <cstdio> #include <cmath> #include <cstring> using namespace std; struct P{ int N, Num; }ans[40000]; long long ansn, num, t, temp, n, a, b; bool flag[40000]; int prime[40000]; char s[1000]; char c1, c2; int main() { memset(flag, true, sizeof(flag)); memset(prime, 0, sizeof(prime)); for(int i = 2;i <= 40000/2;i++){ if(flag[i]){ for(int j = i << 1;j <= 40000;j+=i){ flag[j] = false; } } } num = 0; for(int i = 2;i <= 32767;i++){ if(flag[i] == true){ prime[++num] = i; } } while(1){ scanf("%d", &a); if(a == 0) break; scanf("%d%c", &b, &c1); n = pow(a, b); if(c1 == ' '){ while(scanf("%d%c%d%c", &a, &c1, &b, &c2)){ n *= pow(a, b); if(c2 == '\n') break; } } n -= 1; temp = n; if(flag[n] == true){ printf("%lld 1\n", n); continue; } ansn = 0; while(temp > 1){ for(int i = 1;i <= num&&prime[i] <= temp;i++){ if(temp%prime[i] == 0){ t = 1; temp/=prime[i]; while(temp%prime[i] == 0){ t++; temp /= prime[i]; } ansn++; ans[ansn].N = prime[i]; ans[ansn].Num = t; } } } for(int i = ansn;i > 0;i--){ if(i == 1)printf("%d %d\n", ans[i].N, ans[i].Num); else printf("%d %d ", ans[i].N, ans[i].Num); } } return 0; }