开灯问题;蛇形填数;竖式问题

  • 数组只有在放在main函数外面时,才可以开得很大;放在main函数内时,数组稍大就会异常退出。
  • 如果要从数组a复制k个元素到数组b,可以这样做:memcpy(b,a,sizeof(int) * k)
  • 如果数组a和b都是浮点型的,复制时要写成 memcpy(b,a,sizeof(double) * k)
  • 使用memcpy函数要包含头文件string.h
  • 如果需要把数组a全部复制到数组b中,可以写得简单一些:memcpy(b,a,sizeof(a))
  • 在很多情况下,最好是在做一件事之前检查是不是可以做,而不要做完再后悔。因为“悔棋”往往比较麻烦。
  • scanf("%s", s)会读入一个不含空格、TAB和回车符的字符串,存入字符数组s。
  • 如果是字符串数组chars[maxn] [maxl],可以用“scanf(“%s”, s[i])”读取第i个字符串。
  • scanf("%s", s)遇到空白字符会停下来。
  • %5d,它表示按照5位数打印,不足5位在前面补空格。
  • strchr的作用是在一个字符串中查找单个字符。
  • printf输出到屏幕,fprintf输出到文件,而sprintf输出到字符串。sprintf应该保证写入的字符串有足够的空间。
  • C语言的字符串是以空字符“\0”结尾的。
  • 函数strlen(s)的作用是获取字符串s的实际长度。字符串中的各个字符依次是s[0], s[1],…, s[strlen(s)-1],而s[strlen(s)]正是结束标记“\0”。
  • 由于字符串的本质是数组,它也不是“一等公民”,只能用strcpy(a, b),strcmp(a, b),strcat(a, b)来执行“赋值”、“比较”和“连接”操作,而不能用“=”、“==”、“<=”、“+”等运算符。上述函数都在string.h中声明。
  • “\n”表示换行,“\\”表示反斜杠,“\””表示引号,“\0”表示空字符。
  • 语句printf("%d %o %x\n", a)将把整数a分别按照十进制、八进制和十六进制输出。

程序3-2 开灯问题

有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。k≤n≤1000。 
样例输入: 
7 3 
样例输出: 
1 5 6 7

#include<stdio.h>
#include<string.h>
#define maxn 1010
int a[maxn];
int main() {
    int n, k;
    memset(a, 0, sizeof(a));
    while(scanf("%d%d", &n, &k)!=EOF) {
        int first = 1;
        for(int i=1;i<=k;i++) {
            for(int j=1; j<=n; j++) {
                if(j%i == 0) {
                    a[j] = !a[j];
                }
            }
        }
        for(int i = 1; i<=n; i++) {
            if(a[i]) {
                if(first) {
                    first = 0;
                } else {
                    printf(" ");
                }
                printf("%d", i);
            }
        }
        printf("\n");
    }
    return 0;
}
  • memset(a,0,sizeof(a))的作用是把数组a清零,它也在string.h中定义。虽然也能用for循环完成相同的任务,但是用memset又方便又快捷。
  • 为了避免输出多余空格,设置了一个标志变量first,可以表示当前要输出的变量是否为第一个。第一个变量前不应有空格,但其他变量都有。

程序3-3 蛇形填数

在n×n方阵里填入1,2,…,n×n,要求填成蛇形。n≤8。

#include<stdio.h>
#include<string.h>
#define maxn 20
int a[maxn][maxn];
int main() {
    int n;
    while(scanf("%d", &n) != EOF) {
        int x, y, tot = 0;
        memset(a, 0, sizeof(a));
        tot = a[x=0][y=n-1] = 1;
        while(tot < n*n) {
            while(x+1<n && !a[x+1][y]) {
                a[++x][y] = ++tot;
            }
            while(y-1>=0 && !a[x][y-1]) {
                a[x][--y] = ++tot;
            }
            while(x-1>=0 && !a[x-1][y]) {
                a[--x][y] = ++tot;
            }
            while(y+1<n && !a[x][y+1]) {
                a[x][++y] = ++tot; 
            }
        }
        for(x = 0; x < n; x++) {
            for(y=0; y < n; y++) {
                printf("%3d", a[x][y]);
            }
            printf("\n");
        }
    }
    return 0;
}

程序3-4 竖式问题

找出所有形如abc*de(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。

#include<stdio.h>
#include<string.h>
int main() {
    int count = 0;
    char s[20], buf[99];
    scanf("%s", s);
    for(int abc = 111; abc <=999; abc ++) {
        for(int de = 11; de <=99; de++) {
            int x = abc * (de%10);
            int y = abc * (de/10);
            int z = abc * de;
            sprintf(buf, "%d%d%d%d%d",abc,de,x,y,z);

            int ok = 1;
            for(int i=0; i<strlen(buf); i++) {
                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;
}

转载自:Meteor_0723 

猜你喜欢

转载自blog.csdn.net/LXQ1071717521/article/details/81084992
今日推荐