问题描述
给定一个整数值,若能有整数前半部分乘积与剩余部分乘积相等,则为平衡数。
例如:
输入1236
输出true
分析:123 = 6
输入1221
输出true
分析:12=21
输入1000
输出true
分析:10=00 / 100 = 0
解决思路
首先将整数拆分成整数数组n1。
定义两个变量p,q,分别代表数组第一个下标值和最后一个下标值。
定义两个变量res1,res2,分别存储前半部分乘积和后半部分的乘积,初始值为1。
在p<=q的前提下,
若res1>=res2则表示前半部分值大于后半部分的值,则将q向前移一位,res2的值变为res2n1[q]。反之,q向后移一位,res1的值变为res1n1[p]。
最后比较res1与res2的值大小,相等则返回true。
注:还要考虑整数里有0的情况。
实现代码
public class balanceNum {
private static boolean isBalance(int n){
int[] n1=NToIArray(n);
int len = n1.length;
int p=0;
int q=len-1;
int res1=1;//从前往后的乘积
int res2=1;//从后往前的乘积
//数组中有0
int count =0;
for(int c:n1){
if(c==0)
count++;
}
if(count==1)
return false;
if(count>=2)
return true;
//数组中不含0的情况
while(p<=q){
if(res1>=res2){
res2*=n1[q];
q--;
}else{
res1*=n1[p];
p++;
}
}
if(res1==res2)
return true;
else
return false;
}
/**
* 整数拆分成整数数组
* @param n
* @return
*/
private static int[] NToIArray(int n){
String s = String.valueOf(n);//int转string
int len = s.length();
int[] a = new int[len];
for(int i=0;i<len;i++){
a[i]=Integer.parseInt(String.valueOf(s.charAt(i)));
}
return a;
}
public static void main(String arg[]){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.println(isBalance(n));
}
}