Post by huangno1 on Mar 1, 2017 21:12:14 GMT -8
程式說明
利用手機傳短訊在現在的社會就像吃飯喝水一樣,是再平常不過的事。但如果傳遞的訊息牽涉到隱私,就要特別留意了。阿強想要把一個密碼傳給他的弟弟,可是又怕密碼被有心人士盜用。於是他和弟弟定了一個解讀密文的規則:
(1) 密文會由一連串的英文字母(大小寫均可)夾雜兩個整數值。整數值可能出現在最前面或最後面,兩個整數值之間必定存在至少一個英文字母。
(2) 解讀時,會看英文字中,S/s 出現的次數和 P/p 出現的次數何者較大,如果前者較大,則密碼是兩個整數值的總和 (sum),否則是兩個整數值的乘積 (product)。若兩者的次數相同,也是以乘積為密碼。
這個功能的目的就是讀入一串密文(不超過20個字元),輸出解讀後的整數密碼。可假設解讀後的密碼數值不大於 10^9。輸入與輸出格式請參見範例。
請撰寫一個支援函式:
Decrypt():傳入一個字串,代表傳遞的密文;回傳一個整數值,代表解讀後的數字密碼。
【輸入範例1】
7a8
【輸出範例1】
Code:56
【輸入範例2】
7s8
【輸出範例2】
Code:15
【輸入範例3】
abcss123p50qk
【輸出範例3】
Code:173
【輸入範例4】
12Sss5pp
【輸出範例4】
Code:17
#include <stdio.h>
#include <ctype.h>
int Decrypt ( char code[] )
{
char num1[ 10 ] = {};
int num2[ 10 ] = {};
int sum_s = 0 , sum_p = 0 , i = 0 , j = 0 , k = 0 ;
int end_num1[ 20 ] = {} , end_num2[ 20 ] = {} , len_1 = 0 , len_2 = 0 ;
int E1 = 0 , E2 = 0 , end = 0 , flag = 0 ;
for ( i = 0 ; i < 10 ; i++ ){
num1 [ i ] = '0' + i ;
num2 [ i ] = i ;
}
while ( code [ j ] != '\0' ){
if ( isalpha( code[ j ] ) )
code[ j ] = tolower ( code[ j ] ) ;
if ( code[ j ] == 's' )
sum_s += 1 ;
if ( code[ j ] == 'p' )
sum_p += 1 ;
if ( isdigit( code[ j ] ) )
{
for ( i = 0 ; i < 10 ; i ++){
if ( code[ j ] == num1[ i ] ){
if ( flag == 0 ){
end_num1[ k ] = num2 [ i ] ;
len_1 += 1 ;
k ++ ;
if ( !( isdigit( code[ j + 1 ] )) )
{ flag = 1 ; k = 0 ; }
}
else{
end_num2[ k ] = num2 [ i ] ;
len_2 ++ ;
k ++ ;
}
}
}
}
j++ ;
}
k = 1 ;
for ( i = len_1 - 1 ; i >= 0 ; i -- ){
E1 += end_num1[ i ] * k ;
k *= 10 ;
}
k = 1 ;
for ( i = len_2 - 1 ; i >= 0 ; i -- ){
E2 += end_num2[ i ] * k ;
k *= 10 ;
}
if ( sum_s > sum_p )
return E1 + E2 ;
else
return E1 * E2 ;
}
// ----------------------------------------------
int main()
{
char code[21]= {};
gets(code);
printf("Code:%d\n", Decrypt(code));
return 0;
}
利用手機傳短訊在現在的社會就像吃飯喝水一樣,是再平常不過的事。但如果傳遞的訊息牽涉到隱私,就要特別留意了。阿強想要把一個密碼傳給他的弟弟,可是又怕密碼被有心人士盜用。於是他和弟弟定了一個解讀密文的規則:
(1) 密文會由一連串的英文字母(大小寫均可)夾雜兩個整數值。整數值可能出現在最前面或最後面,兩個整數值之間必定存在至少一個英文字母。
(2) 解讀時,會看英文字中,S/s 出現的次數和 P/p 出現的次數何者較大,如果前者較大,則密碼是兩個整數值的總和 (sum),否則是兩個整數值的乘積 (product)。若兩者的次數相同,也是以乘積為密碼。
這個功能的目的就是讀入一串密文(不超過20個字元),輸出解讀後的整數密碼。可假設解讀後的密碼數值不大於 10^9。輸入與輸出格式請參見範例。
請撰寫一個支援函式:
Decrypt():傳入一個字串,代表傳遞的密文;回傳一個整數值,代表解讀後的數字密碼。
【輸入範例1】
7a8
【輸出範例1】
Code:56
【輸入範例2】
7s8
【輸出範例2】
Code:15
【輸入範例3】
abcss123p50qk
【輸出範例3】
Code:173
【輸入範例4】
12Sss5pp
【輸出範例4】
Code:17
#include <stdio.h>
#include <ctype.h>
int Decrypt ( char code[] )
{
char num1[ 10 ] = {};
int num2[ 10 ] = {};
int sum_s = 0 , sum_p = 0 , i = 0 , j = 0 , k = 0 ;
int end_num1[ 20 ] = {} , end_num2[ 20 ] = {} , len_1 = 0 , len_2 = 0 ;
int E1 = 0 , E2 = 0 , end = 0 , flag = 0 ;
for ( i = 0 ; i < 10 ; i++ ){
num1 [ i ] = '0' + i ;
num2 [ i ] = i ;
}
while ( code [ j ] != '\0' ){
if ( isalpha( code[ j ] ) )
code[ j ] = tolower ( code[ j ] ) ;
if ( code[ j ] == 's' )
sum_s += 1 ;
if ( code[ j ] == 'p' )
sum_p += 1 ;
if ( isdigit( code[ j ] ) )
{
for ( i = 0 ; i < 10 ; i ++){
if ( code[ j ] == num1[ i ] ){
if ( flag == 0 ){
end_num1[ k ] = num2 [ i ] ;
len_1 += 1 ;
k ++ ;
if ( !( isdigit( code[ j + 1 ] )) )
{ flag = 1 ; k = 0 ; }
}
else{
end_num2[ k ] = num2 [ i ] ;
len_2 ++ ;
k ++ ;
}
}
}
}
j++ ;
}
k = 1 ;
for ( i = len_1 - 1 ; i >= 0 ; i -- ){
E1 += end_num1[ i ] * k ;
k *= 10 ;
}
k = 1 ;
for ( i = len_2 - 1 ; i >= 0 ; i -- ){
E2 += end_num2[ i ] * k ;
k *= 10 ;
}
if ( sum_s > sum_p )
return E1 + E2 ;
else
return E1 * E2 ;
}
// ----------------------------------------------
int main()
{
char code[21]= {};
gets(code);
printf("Code:%d\n", Decrypt(code));
return 0;
}