Epic Systems Interview Question
Member Technical StaffsCountry: India
Interview Type: Written Test
and in the question 123*1*2*3=738.
Not optimized but a quick solution:
public class SeedNumber {
public static void printSeed(int n){
for(int i=1;i<n;i++){
String nchar=Integer.toString(i);
int prod=i;
for(int j=0;j<nchar.length();j++){
int p=nchar.charAt(j)-'0';
prod=prod*p;
}
if(prod==n)
System.out.println(i);
}
}
public static void main(String[] args) {
int n=738;
printSeed(n);
}
}
public void getSeeds(int n) {
for (int i = 1; i <= n; i++) {
if (isSeed(n, i)) {
System.out.println(i);
}
}
}
public boolean isSeed(int target, int num) {
return (getDigitProduct(num) * num == target);
}
public int getDigitProduct(int n) {
if (n == 0) {
return 0;
}
return (n / 10 == 0) ? n : getDigitProduct(n/10) * (n % 10);
}
My one is backtracking algorithm. It should work very fast.
N 23412367188, result: 13272317
N=93512378880, result: 23452182
N=615954598560, result: 13579246
N=559999999440, result: 12345679
#include <iostream>
#include <set>
using namespace std;
set<int> Result;
set<int>::iterator it;
long long N;
void init(){
Result.clear();
};
bool check(long long N, long long P){
long long myP = 1;
while(N > 0){
myP *= N%10;
N = N/10;
};
return (P == myP);
}
void findSeed(long long N, long long P){
//basecases:
if (P > N) return;
if (check(N,P)){
Result.insert(N);
return;
}
//recursive:
for(int d = 9; d >= 2 ; d--)
if (0==N%d){
findSeed(N/d, P*d);
};
}
int main()
{
N = 23412367188; // result: 13272317
init();
if (N<10) cout <<N<<endl;
else findSeed(N,1);
if (Result.size()){
cout <<N<<": ";
for(it= Result.begin(); it!= Result.end(); ++it)
cout <<*it<<" ";
cout <<endl;
}
return 0;
}
public static ArrayList<Integer> getSeeds(int number) {
if(number != -1) {
ArrayList<Integer> seedList = new ArrayList<>();
for(int i = 0; i < number; i++) {
int seedValue = getSeedValue(i, number);
if(seedValue == number) {
seedList.add(i);
}
}
return seedList;
}
return null;
}
public static int getSeedValue(int number, int targetNo) {
if(number != -1) {
int seedValue = number;
while(number != 0) {
seedValue *= (number % 10);
number = number / 10;
if(seedValue > targetNo) {
break;
}
}
return seedValue;
}
return -1;
}
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
vector<int>v;
int proddig[10000];
int getdig(int x)
{
int prod=1,temp=x;
while(temp)
{
prod*=(temp%10);
temp/=10;
}
return proddig[x]=prod;
}
int main() {
memset(proddig,0,sizeof proddig);
long long int n;
cin>>n;
for(int i=1;i<=n/2;i++)
{
if(i*(proddig[i]?proddig[i]:getdig(i))==n)
v.pb(i);
}
if(v.size()==0)
cout<<"NO seeds exist!!!"<<endl;
else
{
for(int i=0;i<v.size();i++)
cout<<v[i]<<endl;
}
return 0;
}
Here is one simple solution.
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int input = in.nextInt();
ArrayList<Integer> seedNumbersList = new ArrayList<Integer>();
for(int i=0; i<input/2; i++){
char[] numStr = Integer.toString(i).toCharArray();
int temp = i;
for(char c:numStr){
temp *= Character.getNumericValue(c);
}
if(temp == input){
seedNumbersList.add(i);
}
}
for(int number:seedNumbersList){
System.out.println(number);
}
}
public class SeedNumber {
public static void printSeed(int n){
for(int i=1;i<n;i++){
String nchar=Integer.toString(i);
int prod=i;
for(int j=0;j<nchar.length();j++){
int p=nchar.charAt(j)-'0';
prod=prod*p;
}
if(prod==n)
System.out.println(i);
}
}
public static void main(String[] args) {
int n=738;
printSeed(n);
}
}
public class SeedNumber {
public static void printSeed(int n){
for(int i=1;i<n;i++){
String nchar=Integer.toString(i);
int prod=i;
for(int j=0;j<nchar.length();j++){
int p=nchar.charAt(j)-'0';
prod=prod*p;
}
if(prod==n)
System.out.println(i);
}
}
public static void main(String[] args) {
int n=738;
printSeed(n);
}
}
}
- saran1191 April 14, 2015