东华oj-挑战题第10题-分解质因数

10 分解质因数

作者: Turbo时间限制: 1S章节: 基本练习(循环)

问题描述 :

求出区间[a,b]中所有整数的质因数分解。

输入说明 :

输入两个整数a,b。

2<=a<=b<=10000

输出说明 :

每行输出一个数的分解,形如k=a1a2a3…(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

代码:

/*
	1 2 3 4 5 6 7 8 9 0 ! @ # $ % ^ & * () 
	T10 分解质因数
*/ 
#include<stdio.h>
#include<math.h>
#define MAX_SIZE 10005

int isPrime[MAX_SIZE] = {0};// 素数表,isPrime[i]= 1标记i是素数
void createPrimeTable();

int main() {
	int temp = 0, flag = 0;
	int i = 0, j = 0, k = 0;
	int a = 0, b = 0;
	
	createPrimeTable();
	scanf("%d%d", &a, &b); 
	
	for (i = a; i <= b; i++) {
		printf("%d", i);
		flag = 0;
		
		for (j = 2; j <= sqrt(i); j++) {// 寻找质因数 
			if (isPrime[j] == 1 && i % j == 0) {
				flag = 1;
				printf("=%d", j);
				temp = i / j;
				if (isPrime[temp]) {// 已经分解完了,结束 
					printf("*%d", temp);
					break;
				} 
					
				while (isPrime[temp] == 0) {// 分解 
					for (k = j; k <= sqrt(temp); k++) {
						if (isPrime[k] == 1 && temp % k == 0) {
							printf("*%d", k);
							temp = temp / k;
							break;
						} 
					}
				}
				if (isPrime[temp])// 处理尾部 
					printf("*%d", temp);
				
				break;
			}
		}
		if (!flag)
			printf("=%d", i);
		
		printf("\n");
	} 
	
	return 0;
} 

// 建立素数表 
void createPrimeTable() {
	int i = 0, j = 0;
	
	for (j = 0; j < MAX_SIZE; j++)// 初始时标记全为素数 
		isPrime[j] = 1; 
	
	i = 2;
	while (i < MAX_SIZE - 1) {
		if (isPrime[i]) {
			for (j = 2; i * j < MAX_SIZE; j++) {
				isPrime[i * j] = 0;
			}
		}
		i++;
	}
}

害,看到其他大佬的写法,我这代码是真滴low

优化思路及代码:

/*
	1 2 3 4 5 6 7 8 9 0 ! @ # $ % ^ & * () 
	T10 分解质因数-进阶版 
	
	利用一个原理,每一个大于2的非素数都可以表示成素数乘积的形式,
	而且这些素数都是比该非素数小的 
*/ 

/*
	1 2 3 4 5 6 7 8 9 0 ! @ # $ % ^ & * () 
	T10 分解质因数-进阶版 
	
	利用一个原理,每一个大于2的非素数都可以表示成素数乘积的形式,
	而且这些素数都是比该非素数小的 
*/ 
#include<stdio.h>

int main() {
	int temp = 0;
	int i = 0, j = 0;
	int a = 0, b = 0;
	
	scanf("%d%d", &a, &b); 
	
	for (i = a; i <= b; i++) {
		printf("%d=", i);
		temp = i; 
		
		// 检查每个数是否为i的因数,从最小的素数2开始。为什么这里能保证
		// 输出的每个数都是素数呢?假设输出的某个因数不是素数,由于每个非素数
		// 都能被其他比它小的素数整除,所以该因数一定能被前面比它小的素数整除,
		// 而前面比它小的素数都已经处理过了,所以假设不成立 
		// 比如某个因数是14,而14=2*7,能走到14,说明前面的2和7已经判断过了,
		// 所以14是不会输出的
		j = 2; 
		while (temp != j) {
			if (temp % j == 0) {// 是因数,输出 
				printf("%d*", j);
				temp /= j;
			}
			else // 找下一个不同的因数 
				j++;
		}
		printf("%d", temp); 
		
		printf("\n");
	} 
	
	return 0;
} 

简洁多了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值