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;
}
posted @ 2011-06-09 22:36  KOKO's  阅读(351)  评论(0编辑  收藏  举报