四川大学第二届SCUACM新生赛——J. n=a*b*c

给你一个整数 n(1<=n<=100000), 请你将其拆成三个整数 a,b,c (1<a<=b<=c<n), 的乘积,要求 c-a 尽可能小,在此前提下,a 也尽可能小。

输入描述:
第一行一个整数 T(1<=T<=1000) 表示数据组数。
对于每组数据,一个整数 n(1<=n<=100000) 。

输出描述:
如果可以拆成三个整数的乘积,输出一行形如 n=a * b * c 的信息,其中 a,b,c 按升序排列。
如果不能拆成三个整数的乘积,输出 No solution 。

示例1

输入

2
12
10

输出

12=2 * 2 * 3
No solution

题解:分别暴力枚举a,b,c,c-a的最小值跑一遍就得出,
a,b,c最后的顺序一定是升序( i * i * i 和 j * j 可以判断)。

#include<iostream>
using namespace std;
typedef long long ll; 
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n,a,b,c,ans=100000;
		cin>>n;
		for(ll i=2;i*i*i<=n;i++)//a
		{
			if(n%i==0)
			{
				int x=n/i;//b*c
				for(ll j=i;j*j<=x;j++)//b
				{
					if(x%j==0&&x/j-i<ans)
					{
						ans=x/j-i;//c-a的最小值 
						a=i;
						b=j;
						c=x/j;
					}
				}
			}
				
		} 
		if(ans==100000)
			cout<<"No solution"<<endl;
		else
			cout<<n<<"="<<a<<"*"<<b<<"*"<<c<<endl;
	}
	
	return 0;
 } 
发布了88 篇原创文章 · 获赞 30 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43667611/article/details/103130651
ABC