解题思路:

先按照题目的思路先判断是不是素数,是素数就是本身,不是就开始分解

例如3是素数,那么输出3=3:4不是,分解输出4=2*2;

举个简单的例子进行分解 如 64=2*2*2*2*2;

for(i = 2; i <= n; i++)一开始从2开始,那么64%2 == 0,那么2是它的因子,

那么(重点,int t,用 t 保存 64,因为它一直不会变)来了,剩下的因子的乘积就等于 -> t/2=32,我们就从 32 里面取剩下的因子,i 最多取到 32,

那么原来的for循环的 i 的最终值要变成 32,题目又要求是因子必须是质数,那么 i 的初始值 从 i = 2开始。

依此类推,一步一步得分解! 解的过程中,用数组保存质因子。

注意事项:

        代码用C耗时40ms,C++的200多。。。

参考代码:

#include<stdio.h>
#include<math.h>
int prime(int n)  //验证素数 
{
	int i, x, t;
	t =	(int)(sqrt(n));
	for(i = 2; i <= t; i++)
		if(n%i == 0) return 1;
	return 0;
}
void primetwo(int n)  //分解质因数 
{
	int i, a[100], k = 0, t, sum = 1;
	t = n;
	for(i = 2 ; i <= n ; i++)
	{
		if(n % i == 0)
		{
			a[k] = i;
			sum = sum * a[k];
			n = t / sum;			
			i = 1;	k++;					
		}	
	}
	printf("%d=",t);
	for(i = 0 ; i < k ; i++)
	{
		printf("%d",a[i]);		
		if(i < k - 1) printf("*"); //最后一个没有 * 号 
	}	
	printf("\n");
}
int main()
{		
	int a, b, i;
	scanf("%d%d",&a,&b);
	for(i = a; i <= b; i++)
	{
		if(prime(i))  //不是素数 
		{		
			primetwo(i);
		}
		else
		{
			printf("%d=%d\n",i,i);			
		}
	}		
	return 0;	
}


点赞(8)
 

0.0分

14 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 12 条评论

IceHowe 2年前 回复TA
@bilibili用户 你这代码错的离谱,你还有脸说别人菜,输入15到20,直接输出15=15 16=16 17=17 18=18 19=19 20=20
菠萝冰 3年前 回复TA
@bilibili用户 okok
bilibili用户 3年前 回复TA
@bilibili用户 @200054070157 又不是写这个例子的 晕 这个是思想啊 你改改就好了
菠萝冰 3年前 回复TA
@bilibili用户 .。。。。。。
菠萝冰 3年前 回复TA
@bilibili用户 为啥这个连例子都过不了呢?
zd 4年前 回复TA
bool ispri(ll x) {
	if (x == 2 || x == 3) return 1;
	for (ll i = 2; i <= sqrt(x); i++) {
		if (x%i==0) {
			return 0;
		}
	}
	return 0;
}

int main() {
	IOS;
	ll a, b;
	cin >> a >> b;
	for (ll i = a; i <= b; i++) {
		ll te = 2;
		cout << i;
		ll res = 1;
		if (ispri(i)) cout << "="<< i << endl;
		else {
			cout << "=";
			while (1) {
				while (i%(res*te)==0 && (res*te)<=i) {
					cout << te;
					res = res * te;
					if (res!=i) cout << "*";
				}
				te++;
				if (res==i) break;
			}
			cout << endl;
		}
	}
	return 0;
}
zd 4年前 回复TA
#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false), cout.tie(0), cin.tie(0)
#define pb push_back
#define lag(i, k, r) for (int i = k; i < r; i++)
#define rag(i, k, r) for (int i = k; i <= r; i++)
typedef pair<string, int> si;
typedef pair<int, int> ii;
typedef pair<int, string> is;
typedef long long ll;

bool ispri(ll x) {
	if (x == 2 || x == 3) return 1;
	for (ll i = 2; i <= sqrt(x); i++) {
		if (x%i==0) {
			return 0;
		}
	}
	return 0;
}

int main() {
	IOS;
	ll a, b;
	cin >> a >> b;
	for (ll i = a; i <= b; i++) {
		ll te = 2;
		cout << i;
		ll res = 1;
		if
斯宾塞 4年前 回复TA
bilibili用户 4年前 回复TA
菜
#include <iostream>
using namespace std;
int dp[10000];
void f(int a)
{
	if(a==1) 
	{
		return ;
	}
	else 
	{
		int i;
		for(i=2;i<a;++i)
		{
			if(dp[i]==0&&a%i==0)
			{
				cout<<i<<"*";
				a/=i;
				break;
			}
		}
		f(a);
	}
}
int main()
{
	int n,m,i,j;
	cin>>n>>m;
	for(i=n;i<=m;++i)
	{
		for(j=2*i;j<=m;j+=i)
		{
			dp[j]=1;
		}
	}
	for(i=n;i<=m;++i)
	{
		if(dp[i]==0)
		{
			cout<<i<<"="<<i<<endl;
		}
		else 
		{
			f(i);
		}
	}
}
递归加素数筛子
dylan 4年前 回复TA
@。 因为结束一轮循环的时候要执行i++,i就从2再接着开始找