NC54669. n=a*b*c
描述
输入描述
第一行一个整数 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); } }