例题 3-1 TeX中的引号(Tex Quotes)
#include<stdio.h>
int main()
{
int c, q = 1;
while((c = getchar()) != EOF)
{
if (c == '"')
{
printf("%s", q ? "“" : "”");
q = !q;
}
else
printf("%c", c);
}
return 0;
}
例题 3-2 WERTYU
#include<stdio.h>
char s[] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
int main()
{
int i, c;
while ((c = getchar()) != EOF)
{
for (i = 1; s[i] && s[i]!=c; i++);
if (s[i])
putchar(s[i-1]);
else
putchar(c);
}
}
例题 3-3 回文词(Palindromes)
#include<stdio.h>
#include<string.h>
#include<ctype.h>
const char* rev = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";
const char* msg[] = {"not a palindrome", "a regular palindrome", "a mirrored string", "a mirrored palindrome"};
char r(char ch)
{
if (isalpha(ch))
return rev[ch-'A'];
return rev[ch-'0'+25];
}
int main()
{
char s[30];
while (scanf("%s", s) == 1)
{
int len = strlen(s);
int p = 1, m = 1;
for (int i = 0; i < (len+1)/2; i++)
{
if (s[i] != s[len-1-i])
p = 0; //不是回文串
if (r(s[i]) != s[len-1-i])
m = 0; //不是镜像串
}
printf("%s -- is %s.\n\n", s, msg[m*2+p]);
}
return 0;
}
例题 3-4 猜数字游戏的提示(Master-Mind Hints)
#include<stdio.h>
#define maxn 1010
int main()
{
int n, a[maxn], b[maxn];
int kase = 0;
while (scanf("%d", &n) == 1 && n) //n=0时输入结束
{
printf("Game %d:\n", ++kase);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
for (;;)
{
int A = 0, B = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &b[i]);
if (b[i] == a[i])
A++;
}
if (b[0] == 0)
break;
for (int d = 1; d <= 9; d++)
{
int c1 = 0, c2 = 0; //统计数字d在答案序列和猜测序列中各出现多少次
for (int i = 0; i < n; i++)
{
if (a[i] == d)
c1++;
if (b[i] == d)
c2++;
}
if (c1 < c2)
B += c1;
else
B += c2;
}
printf(" (%d,%d)\n", A, B-A);
}
}
return 0;
}
例题 3-5 生成元(Digit Generator)
#include<stdio.h>
#include<string.h>
#define maxn 100005
int ans[maxn];
int main()
{
int T, n;
memset(ans, 0, sizeof(ans));
for (int m = 1; m < maxn; m++)
{
int x = m, y = m;
while (x > 0)
{
y += x % 10;
x /= 10;
}
if (ans[y] == 0 || m < ans[y])
ans[y] = m;
}
scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
printf("%d\n", ans[n]);
}
return 0;
}
例题 3-6 环状序列(Circular Sequence)
#include<stdio.h>
#include<string.h>
#define maxn 105
//环状串s的表示法p是否比表示法q的字典序小
int less(const char* s, int p, int q)
{
int n = strlen(s);
for (int i = 0; i < n; i++)
if (s[(i+p)%n] != s[(i+q)%n])
return s[(i+p)%n] < s[(i+q)%n];
return 0; //相等
}
int main()
{
int T;
char s[maxn];
scanf("%d", &T);
while (T--)
{
scanf("%s", s);
int ans = 0;
int n = strlen(s);
for (int i = 1; i < n; i++)
if (less(s, i, ans))
ans = i;
for (int i = 0; i < n; i++)
putchar(s[(i+ans)%n]);
putchar('\n');
}
}