密碼發生器
時間限制:1000 ms | 記憶體限制:65535 KB
難度:2
- 描述
-
在對銀行賬戶等重要許可權設定密碼的時候,我們常常遇到這樣的煩惱:如果為了好記用生日吧,容易被破解,不安全;如果設定不好記的密碼,又擔心自己也會忘記;如果寫在紙上,擔心紙張被別人發現或弄丟了…
這個程式的任務就是把一串拼音字母轉換為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行字串,就是等待變換的字串(長度小於100)。
- 輸出
- 變換後的6位密碼
- 樣例輸入
-
5 zhangfeng wangximing jiujingfazi woaibeijingtiananmen haohaoxuexi
- 樣例輸出
-
772243 344836 297332 716652 875843
- 來源
- 2012藍橋杯-8
- 上傳者
- 侯颯颯
- 演算法思想:先判斷6個一組,看一下有多少組,用len。然後把每個位置垂直的字元轉換成整形相加,儲存在b陣列。因為字串小於100,100除以6 最多等於17,也就是最大17組,17在乘以最大的z的整形(123)等於2091也就是最大有4位,用陣列c儲存。具體看程式碼實現。
- 程式碼:
-
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 int i,j,k,len,t; 6 int b[6],c[6]; 7 char ch[105]; 8 scanf("%d",&t); 9 while(t--) 10 { 11 memset(ch,0,sizeof(ch)); 12 memset(b,0,sizeof(b)); 13 scanf("%s",&ch); 14 len = strlen(ch)/6; //6個一組,看一下有多少組 15 k = 0; 16 for(j=0; j<=len; j++) 17 { 18 for(i=0; i<6; i++) 19 { 20 b[i] += int(ch[i+k]); //b[i]表示垂直在同一個位置的字元ASCII碼的int值和 21 } 22 k+=6; 23 } 24 for(i=0; i<6; i++) 25 { 26 c[4] = b[i]; 27 while(c[4] >= 10) //因為字串小於100,100除以6 最多等於17,17*z的int(123)不會大於4位數。 28 { 29 c[0] = c[4]%10; 30 c[1] = c[4]/10%10; 31 c[2] = c[4]/100%10; 32 c[3] = c[4]/1000%10; 33 c[4] = c[0]+c[1]+c[2]+c[3]; 34 } 35 printf("%d",c[4]); 36 } 37 printf(" "); 38 } 39 return 0; 40 }