把手放在鍵盤上時,稍不注意就會往右錯一位。這樣,輸入q會變成輸入w,輸入j會變成輸入k等。
輸入乙個錯位後敲出的字串(所有字母均大寫),輸出打字員本來想打出的句子。輸入保證合法,即一定是錯位之後的字串。例如輸入中不會出現大寫字母a。
o s, gomr ypfsu/
i am fine today.
每輸入乙個字元,都可以直接輸出乙個字元,因此getchar是輸入的理想方法。問題在於:如何進行這樣輸入輸出變換呢?乙個較好的方法是使用常量陣列。
#include char s[ ] = "`1234567890-=qwertyuiop\\asdfghjkl;'zxcvbnm,./";
int main()
return 0;
}
常量陣列s中的 \\ 是轉義字元。用 \\ 這個字元來表示真正意義上的反斜線即 \ 。
輸入乙個字串,判斷它是否為回文以及映象串。輸入字串保證不含數字0.所謂回文串,就是反轉之後原串相同,如abba和madam。所謂映象串,就是左右映象之後和原串相同,如2s和3aiae。注意,並不是每個字元在映象之後都能得到乙個合法字元,本題中,每個字元的映象如下所示,(空白項表示該字元映象後不能得到乙個合法的字元)。
輸入的每行包含乙個字串(保證只有上述字元。不含空白字元),判斷它是否是回文串和映象串(共4種組合)。每組資料之後輸出乙個空行。
notapalindrome
isapalinilapasi
2a3meas
atoyota
notapalindrome -- is not a palindrome.
isapalinilapasi -- is a regular palindrome.
2a3meas -- is a mirrored string.
atoyota -- is a mirrored palindrome.
#include#include#includeusing namespace std;
const char* rev = "a 3 hil jm o 2tuvwxy51se z 8 "; //指標名可直接當陣列名使用,均指代位址
const char* msg = ;
//四種組合:既不是回文也不是映象、只是回文、只是映象、既是回文又是映象
char mirror(char ch)
int main()
cout << s << " -- is " << msg[m * 2 + p] << '.' << endl << endl;
}return 0;
}
本題用isalpha來判斷字元是否為字母,類似的還有isdigit、isprint等,在ctype.h中定義。由於ascii碼表中大寫字母、小寫字母和數字都是連續的,如果ch是大寫字母,則ch-'a'就是它在字母表中的序號(a的序號是1,b的序號是2,依此類推);類似地,如果ch是數字,則ch-'0'就是這個數字的數值本身(『5』-『0』=5)。
ctype.h中定義的isalpha、isdigit、isprint等工具可以用來判斷字元的屬性,而toupper、tolower等工具可以用來轉換大小寫。
實現乙個經典的「猜數字」遊戲。給定答案序列和使用者猜的序列,統計有多少數字位置正確(a),有多少數字在兩個序列都出現過但位置不對(b)。
輸入包含多組資料。每組輸入第一行為序列長度 n,第二行是答案序列,接下來若干行猜測序列。猜測序列全0 時該組資料結束。 n=0時輸入結束。
41 3 5 5
1 1 2 3
4 3 3 5
6 5 5 1
6 1 3 5
1 3 5 5
0 0 0 0
101 2 2 2 4 5 6 6 6 9
1 2 3 4 5 6 7 8 9 1
1 1 2 2 3 3 4 4 5 5
1 2 1 3 1 5 1 6 1 9
1 2 2 5 5 5 6 6 6 7
0 0 0 0 0 0 0 0 0 0
0game 1:
(1,1)
(2,0)
(1,2)
(1,2)
(4,0)
game 2:
(2,4)
(3,2)
(5,0)
(7,0)
直接統計可得a,為了求b,對於每個數字(1-9),統計二者出現的次數c1和c2,則min(c1,c2)就是該數字對於b的貢獻。最後減去a的部分。
#include #define maxn 1010
int main()
if(b[0] == 0) break;//正常的猜測序列不會有0,所以只判斷第乙個數是否為0即可
for(int d = 1; d <= 9; d++)
if(c1 < c2) b+= c1; else b+= c2;
}printf(" (%d,%d)\n", a, b-a);
} } return 0;
}
如果x加上x的各個數字之和得到y,就說x是y的生成元。
給出n(1≤n≤100000),求最小 生成元。無解輸出0。例如,n=216,121,2005時的解分別為198,0,1979。
#include#include#define maxn 100005
int ans[maxn];
int main()
if(ans[y] == 0 || m < ans[y]) ans[y] = m;
} scanf("%d", &t);
while(t--)
return 0;
}
長度為n的環狀串有n種表示法,分別為從某個位置開始順時針得到。例如,圖3-4的環狀串有10種表示:cgagtcagct,gagtcagctc,agtcagctcg等。在這些表示法中,字典序最小的稱為」最小表示」。
輸入乙個長度為n(n≤100)的環狀dna串(只包含a、c、g、t這4種字元)的一種表示法,你的任務是輸出該環狀串的最小表示。
#include#include#define maxn 105
// 環狀串s的表示法p是否比表示法q的字典序小
int less(const char* s, int p, int q)
int main()
return 0;
}
回文詞 題解
題目描述 回文詞是一種對稱的字串 也就是說,乙個回文詞,從左到右讀和從右到左讀得到的結果是一樣的。任意給定乙個字串,通過插入若干字元,都可以變成乙個回文詞。你的任務是寫乙個程式,求出將給定字串變成回文詞所需插入的最少字元數。比如字串 ab3bd 在插入兩個字元後可以變成乙個回文詞 dab3bad 或...
模擬 回文詞
題目描述 回文詞是一種對稱的字串,也就是說 乙個回文詞,從左向右讀和從右向左讀的結果都是一樣的.任意給定乙個字串,通過插入若干個字元,都可以變成乙個回文詞.你的任務是寫乙個程式,求出給定字串變成回文詞所需插入的最小字元數.比如,字串 ab3db 在插入兩個字元後可以變成乙個回文詞 dab3bad a...
回文詞 C語言
題目描述 輸入乙個字串,判斷它是否為回文以及映象串。輸入字串保證不含數字0.所謂回文串,就是反轉之後原串相同,如abba和madam。所謂映象串,就是左右映象之後和原串相同,如2s和3aiae。注意,並不是每個字元在映象之後都能得到乙個合法字元,本題中,每個字元的映象如下所示,空白項表示該字元映象後...