【PTA】分解质因子(解决运行超时)

题目

输入一个正整数n(1≤n≤1e15),编程将其分解成若干个质因子(素数因子)积的形式。

输入格式:
任意给定一个正整数n(1≤n≤1e15)。

输出格式:
将输入的正整数分解成若干个质因子积的形式,质因子的出现顺序按从小到大排列。如:40=222*5;如果整数本身为质数或素数,直接输出,如:13=13。

输入样例:
在这里给出一组输入。例如:

40

输出样例:
在这里给出相应的输出。例如:

40=2*2*2*5

第一次写的代码

逻辑上没什么问题,但是复杂化了问题,没直接输出结果,而是用了两个数组做了两次筛选,最终运行超时,函数堆叠是因为在VS里初始化数组里给的数太大,这在PTA上没有影响
在这里插入图片描述

#include <stdio.h>
#include <math.h>
int prime(long int i)
{
	int j = 0;
	for (j = 2; j <= sqrt(i); j++)
	{
		if (i % j == 0)
		{
			break;
		}
	}
	if (j > sqrt(i))
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int main()
{
	long int n;
	int a[1000] = { 0 };
	int b[100] = { 0 };
	int m = 0;
	int k = 0;
	long int i = 0;
	scanf("%ld", &n);
	if (prime(n))
	{
		printf("%ld=%ld", n, n);
	}
	else
	{
		for (i = 2; i < n; i++)
		{
			if (n % i == 0 && prime(i))
			{
				a[m++] = i;
			}
		}
		long int t = n;
		for (i = m - 1; i >= 0; i--)
		{
			while (t %a[i] == 0&&t!=0)
			{
				b[k++] = a[i];
				t /= a[i];
			}
			if (t == 0)
			{
				break;
			}
		}
		printf("%ld=", n);
		for (i = k-1; i>=0; i--)
		{
			if (i != k-1)
			{
				printf("*");
			}
			printf("%d", b[i]);
		}
	}
	return 0;
}

改进代码

在这里插入图片描述

#include <stdio.h>
#include <math.h>
int prime(long int i)
{
	int j = 0;
	for (j = 2; j <= sqrt(i); j++)
	{
		if (i % j == 0)
		{
			break;
		}
	}
	if (j > sqrt(i))
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int main()
{
	long int n;
	int k = 0;
	long int i = 0;
	scanf("%ld", &n);
	if (prime(n))
	{
		printf("%ld=%ld", n, n);
	}
	else
	{ 
		printf("%ld=", n);
		long int m = n;
		for (i = 2; i < n; i++)
		{
			while (m / i != 1&& m % i == 0)
			{
				if (prime(i))
				{
					printf("%ld*", i);
					m /= i;
				}
			}
			if (m / i == 1)
			{
				printf("%ld", m);
				break;
			}
		}
	}
	return 0;
}
  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值