历届试题 密码发生器
在對銀行賬戶等重要權限設置密碼的時候,我們常常遇到這樣的煩惱:如果為了好記用生日吧,容易被破解,不安全;如果設置不好記的密碼,又擔心自己也會忘記;如果寫在紙上,擔心紙張被別人發現或弄丟了...
??? 這個程序的任務就是把一串拼音字母轉換為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
??? 注意:
??? 請仔細調試!您的程序只有能運行出正確結果的時候才有機會得分!???
??? 在評卷時使用的輸入數據與試卷中給出的實例數據可能是不同的。
?
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 int f(int n) 6 { 7 int z=0; 8 if(n/10==0) 9 return n; 10 while(n) 11 { 12 z+=n%10; 13 n/=10; 14 } 15 f(z); 16 } 17 int main() 18 { 19 int n; 20 int b[7]; 21 char s[1000]; 22 scanf("%d",&n); 23 for(int i=0;i<n;i++) 24 { 25 scanf("%s",s); 26 memset(b,0,sizeof(b)); 27 int len=strlen(s); 28 int a=len/6; 29 if(len%6!=0) 30 { 31 a++; 32 } 33 for(int j=0;j<6;j++) 34 { 35 for(int k=0;k<a;k++) 36 { 37 if(6*k+j>len) 38 b[j]+=0; 39 else 40 b[j]+=s[6*k+j]; 41 } 42 } 43 for(int j=0;j<6;j++) 44 { 45 b[j]=f(b[j]); 46 printf("%d",b[j]); 47 } 48 printf("\n"); 49 } 50 return 0; 51 }?
轉載于:https://www.cnblogs.com/zeze/p/mimafashenqi.html
總結
以上是生活随笔為你收集整理的历届试题 密码发生器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: N 组连续子串最大和
- 下一篇: Basic Level 1018. 锤子