《算法競(jìng)賽入門(mén)經(jīng)典》CH-3(C語(yǔ)言)

洛葉的完整代碼

數(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)

  1. quotesTex.c是p45的例題3-1:將雙引號(hào)轉(zhuǎn)換為T(mén)ex中的左引號(hào)和右引號(hào)。
  2. 解題關(guān)鍵在于設(shè)置標(biāo)志變量來(lái)判斷一個(gè)雙引號(hào)究竟是左引號(hào)還是右引號(hào)。
  3. 輸入字符串:使用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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容