给你一个整数 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;
}