1. 程式人生 > >密碼發生器 在對銀行賬戶等重要許可權設定密碼的時候,我們常常遇到這樣的煩惱:如果為了好記用生日吧,容易被破解,不安全;如果設定不好記的密碼,又擔心自己也會忘記;如果寫在紙上,擔心紙張被別人發現或

密碼發生器 在對銀行賬戶等重要許可權設定密碼的時候,我們常常遇到這樣的煩惱:如果為了好記用生日吧,容易被破解,不安全;如果設定不好記的密碼,又擔心自己也會忘記;如果寫在紙上,擔心紙張被別人發現或

/*
 * 密碼發生器
    在對銀行賬戶等重要許可權設定密碼的時候,我們常常遇到這樣的煩惱:如果為了好記用生日吧,
    容易被破解,不安全;如果設定不好記的密碼,又擔心自己也會忘記;如果寫在紙上,擔心紙張被別人發現或弄丟了...
    這個程式的任務就是把一串拼音字母轉換為6位數字(密碼)。
    我們可以使用任何好記的拼音串(比如名字,王喜明,就寫:wangximing)作為輸入,程式輸出6位數字。
    變換的過程如下:
    第一步. 把字串6個一組摺疊起來,比如wangximing則變為:
    wangxi
    ming
    第二步. 把所有垂直在同一個位置的字元的ascii碼值相加,得出6個數字,如上面的例子,則得出:
    228 202 220 206 120 105
    第三步. 再把每個數字“縮位”處理:就是把每個位的數字相加,得出的數字如果不是一位數字,
    就再縮位,直到變成一位數字為止。例如: 228 => 2+2+8=12 => 1+2=3
    上面的數字縮位後變為:344836, 這就是程式最終的輸出結果!
    要求程式從標準輸入接收資料,在標準輸出上輸出結果。
    輸入格式為:第一行是一個整數n(<100),表示下邊有多少輸入行,接下來是n行字串,就是等待變換的字串。
    輸出格式為:n行變換後的6位密碼。
    例如,輸入:
5
zhangfeng
wangximing
jiujingfazi
woaibeijingtiananmen
haohaoxuexi
    則輸出:
772243
344836
297332
716652
875843
 */
import java.util.Scanner;
public class Demo04 {
	// 縮位
	public static char con(char[] c){
		if(c.length<=1){
			return c[0];
		}
		int temp = 0;
		for(int i=0;i<c.length;i++){
			temp += c[i]-'0';
		}
		c = (""+temp).toCharArray();
		return con(c);
	}
	// 縮位處理,並輸出結果
	public static void condense(int[] n){
		StringBuffer sb = new StringBuffer();
		for(int i=0;i<n.length;i++){
			char[] c = (""+n[i]).toCharArray();
			sb.append(con(c));	// 縮位
		}
		System.out.println(sb);
	}
	// 計算結果
	public static void calc(char[][] c){
		int[] n = new int[6];
		int last = c[c.length-1].length ;
		for(int i=0;i<6;i++){
			for(int j=0;j<c.length-1;j++){
				n[i] += c[j][i];	// 前幾行列相加
			}
		}
		for(int j=0;j<last;j++){
			n[j] += c[c.length-1][j];	// 加上最後一行
		}
		condense(n);	// 縮位處理,並輸出結果
	}
	// 進入主要操作函式
	public static void f(String s){
		int t = (s.length()+5)/6;	// 分為幾組
		char[][] c = new char[t][];
		for(int i=0;i<t;i++){	// 得到分組後的資料
			if(s.length()>6){
				c[i] = s.substring(0, 6).toCharArray();
				s = s.substring(6);
			}else{
				c[i] = s.substring(0, s.length()).toCharArray();
				break;
			}
		}
		calc(c);	// 計算結果
	}
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);	// 輸入整數
		Scanner scan2 = new Scanner(System.in);	// 輸入字串
		System.out.println("輸入整數n(<100)表示下邊有多少輸入行:");
		int n = scan.nextInt();
		String[] ss = new String[n];
		int k=0;
		while(k<n){
			ss[k++] = scan2.nextLine();
		}
		for(int i=0;i<n;i++){
			f(ss[i]);
		}
	}
}
執行結果:
輸入整數n(<100)表示下邊有多少輸入行:
5
zhangfeng
wangximing
jiujingfazi
woaibeijingtiananmen
haohaoxuexi
772243
344836
297332
716652
875843