打印Smith数 求质因数&判断质数&数位相加

问题:

输出400以内的Smith数。Smith数是指满足下列条件的可分解的整数:
        其所有数位上的数字和=其全部素数因子的数字总和
例如,9975是Smith数,9975=3*5*5*7*19,即9975的数字和=因子的数字总和=30


注意相加都是数位相加,而且是要可以分解的数,意思是质数就不能了。

Java实现:

import java.util.*;

class Smith {
	static int[] a = new int[500];

	public static void div_factors(int n) {
		int i = 2;
		int j = 0;
		Arrays.fill(a,0);
		while(i<=n){
			if (n % i == 0) {
				a[j] = i;
				j++;
				n /= i;
				i = 2;
			}
			else
				i++;

		}
	}
	
	public static int num_add(int n) {
		int ans = 0;
		do{
		int tmp = n % 10;
		ans += tmp;
		n /= 10;
		}while(n>0);
		return ans;
	
	}
	
	   public static boolean isPrime(int n){
			int i;
			for( i = 2; i <= Math.sqrt(n); i++){
				if(n % i == 0)
					break;
			}
			if(i == (int)(Math.sqrt(n)+1))
				return false;
			else
				return true;
		}
	
	public static void main(String[] args) {	
		for(int pos = 2; pos <= 400; pos++) {
			int sum = 0;
			div_factors(pos);
			int q = 0;
			while(true){
				
				if(a[q]!=0&&a[q]<10){
					sum += a[q];
					q++;
				}
				else if(a[q]>10){
					do{
					int tmp = a[q]%10;
					sum += tmp;
					a[q] /= 10;
				}while(a[q]>0);
					q++;
			}
			if(a[q] == 0)
				break;
		}

			if(num_add(pos)==sum){
				if(isPrime(pos))
				System.out.println(pos);
			}				
	}
}
}


posted @ 2017-03-18 17:33  Lawliet__zmz  阅读(609)  评论(0编辑  收藏  举报