列表

详情


NC54669. 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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 22ms, 内存消耗: 428K, 提交时间: 2019-11-25 20:55:29

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int q,a=0,b=0,c=0;
	cin>>q;
	while(q--)
	{
		int n,max=999999;
		cin>>n;
		int m=pow(n,1.0/3)+1;
		for(int i=2;i<=m;i++)
		{
			for(int j=2;j*j<=1.0*n/i;j++)
			{
				int k=n/i/j;
				if(k*i*j==n&&j>=i&&k>=j&&k-i<max)
				{
					a=i;b=j;c=k;
					max=k-i;
				}
			}
		}
		if(max==999999) cout<<"No solution\n";
		else cout<<n<<"="<<a<<"*"<<b<<"*"<<c<<"\n";
	}
	return 0;
}

C++(clang++11) 解法, 执行用时: 264ms, 内存消耗: 376K, 提交时间: 2021-02-25 20:47:49

#include<bits/stdc++.h>
using namespace std;
int t, n, a, b, c, cmp, m;
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n;
		cmp=n;
		for(int x=2;x<n;x++)
		{
			if(n%x==0)
			{
				m=n/x;
				for(int y=x;y<=m/y;y++)
				{
					if(m%y==0&&m/y-x<cmp)
					{
						a=x,b=y,c=m/y,cmp=m/y-x;
					}
				}
			}
		}
		if(cmp==n)
		    cout<<"No solution"<<endl;
		else 
		    printf("%d=%d*%d*%d\n",n,a,b,c);
	} 
}

C(clang11) 解法, 执行用时: 9ms, 内存消耗: 352K, 提交时间: 2021-03-01 22:48:47

#include<stdio.h>
int main()
{
	int t;
	scanf("%d",&t);
	for(;t;t--)
	{
		int n;
		scanf("%d",&n);
		int i=2,j,k,a=1,b,c=100000;
		for(;i*i*i<=n;i++)
		{
			for(j=i;j*j*i<=n;j++)
			{
				k=n/i/j;
				if(i*j*k==n&&k>=i&&k>=j&&c-a>k-i)
				{
					a=i;
					b=j;
					c=k;
				}
			}
		}
		if(c==100000) printf("No solution\n");
		else printf("%d=%d*%d*%d\n",n,a,b,c);
	}
}

上一题