數(shù)組
開(kāi)燈問(wèn)題
/*
有n盞燈,編號(hào)為1-n。第1個(gè)人把所有燈打開(kāi),第2個(gè)人按下所有編號(hào)為2
的倍數(shù)的開(kāi)關(guān)(這些燈將被關(guān)掉),第3個(gè)人按下所有編號(hào)為3的倍數(shù)的開(kāi)關(guān)
(其中關(guān)掉的燈打開(kāi),打開(kāi)的燈關(guān)閉),依次類(lèi)推,一共有k個(gè)人,問(wèn)最后有
哪些燈開(kāi)著?輸入n和k,輸出開(kāi)著的燈的編號(hào)。k<=n<=1000。
*/
#include <stdio.h>
#include <string.h>
//將較大的數(shù)組定義在main函數(shù)外,否則程序可能無(wú)法正常運(yùn)行
#define maxn 1010
int light[maxn];
int main()
{
int n, k, first = 1;
//將light數(shù)組清零
memset(light, 0, sizeof(light));
scanf("%d%d", &n, &k);
//模擬開(kāi)關(guān)燈,當(dāng)i = 1的時(shí)候,j%i == 0
//light[j]都變?yōu)?,即為開(kāi)燈
for(int i = 1; i <= k; i++)
{
for(int j = 1; j <= n; j++)
{
if(j % i == 0){light[j] = !light[j];}
}
}
for(int i = 1; i <= n; i++)
{
if(light[i])
{
//當(dāng)不是第一個(gè)輸出的時(shí)候,在輸出數(shù)字之前還
//輸出一個(gè)空格,即將輸出的數(shù)字用空格隔開(kāi)
if(first) {first = 0;}
else {printf(" ");}
printf("%d", i);
}
}
printf("\n");
return 0;
}
蛇形填數(shù)(摘要)
/*
例如
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
其實(shí)就是從右上方開(kāi)始下、左、上、右地循環(huán)填數(shù)
*/
//初始化
tot = snake[x = 0][y = n - 1] = 1;
//下左上右,并避開(kāi)已經(jīng)填過(guò)數(shù)的位置
while(tot < n*n)
{
while(x+1<n && !snake[x+1][y])
{snake[++x][y] = ++tot;}
while(y-1>=0 && !snake[x][y-1])
{snake[x][--y] = ++tot;}
while(x-1>=0 && !snake[x-1][y])
{snake[--x][y] = ++tot;}
while(y+1<n && !snake[x][y+1])
{snake[x][++y] = ++tot;}
}
字符串
scanf("%s", s)
//遇到空格等會(huì)停下來(lái)
豎式問(wèn)題
這道題關(guān)鍵在于判斷abc,de,x,y,z的每一位數(shù)是否都屬于給定的數(shù)字集合,感覺(jué)這道題只是用來(lái)了解一下sprintf()函數(shù)和strchr()函數(shù),沒(méi)有什么實(shí)際意義。
/*
p41的豎式問(wèn)題
找出所有的形如abc*de的算式,是的在完整的豎式中,
所有的數(shù)字都屬于一個(gè)特定的數(shù)字集合。輸入數(shù)字集合(相鄰數(shù)字間沒(méi)有空格),
輸出所有滿足題意的豎式。每個(gè)豎式前應(yīng)有編號(hào),之后應(yīng)有一個(gè)空行。最后輸出解的總數(shù)
樣例輸入:
2357
樣例輸出:
<1>
775
X 33
-----
2325
2325
-----
25575
*/
#include <stdio.h>
#include <string.h>
int main()
{
int count = 0;
char s[20], buf[100];
scanf("%s", s);
for(int abc = 111; abc < 1000; abc++)
{
for(int de = 11; de < 100; de++)
{
int x = abc*(de%10);
int y = abc*(de/10);
int z = abc*de;
//sprintf()將信息輸出到字符串
//應(yīng)當(dāng)保證字符串足夠大,可以容納輸出信息
//這里將整數(shù)轉(zhuǎn)換成了字符串,放到字符數(shù)組里
sprintf(buf, "%d%d%d%d%d", abc, de, x, y,z);
int ok = 1;
//strlen()獲取buf的實(shí)際長(zhǎng)度
for(int i = 0; i < strlen(buf); i++)
{
//strchr()在一個(gè)字符串中查找單個(gè)字符
//如果buf中沒(méi)有這個(gè)數(shù)
if(strchr(s, buf[i]) == NULL)
{ok = 0;}
}
if(ok)
{
printf("<%d>\n", ++count);
printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n", abc, de, x, y, z );
}
}
}
printf("The number of solutions = %d\n", count);
return 0;
}
Tex中的引號(hào)
- quotesTex.c是p45的例題3-1:將雙引號(hào)轉(zhuǎn)換為T(mén)ex中的左引號(hào)和右引號(hào)。
- 解題關(guān)鍵在于設(shè)置標(biāo)志變量來(lái)判斷一個(gè)雙引號(hào)究竟是左引號(hào)還是右引號(hào)。
- 輸入字符串:使用
getchar()一個(gè)一個(gè)地獲取字符。文件結(jié)束的標(biāo)志是EOF,定義在<stdio.h>里。關(guān)鍵代碼只有兩行。
printf("%s", q? "``": "''");
q = !q;
WERTYU, UVa10082
用鍵盤(pán)打出的錯(cuò)位字符串,將其糾正,要求是把每個(gè)都變成其前一位,輸入始終合法,即不考慮輸入為`QAZ的情況,輸入均為大寫(xiě)。
注意getchar()的返回值是標(biāo)準(zhǔn)輸入的ASCII碼,所以讀零的時(shí)候s[i] = 48,不是0,所以if還是執(zhí)行。
#include <stdio.h>
char *s = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
int main(void)
{
int i, c;
while((c = getchar()) != EOF)
{
for(i = 1; s[i] && s[i] != c; i++)
;
/*注意getchar()的返回值是標(biāo)準(zhǔn)輸入的ASCII碼,
所以讀零的時(shí)候s[i] = 48,不是0,所以if還是執(zhí)行
*/
if(s[i])
putchar(s[i-1]);
else
putchar(c);
}
return 0;
}