3.1 数组

程序 3-1 将不超过100个数逆序输出

#include<stdio.h>
int main()
{
      int const MAXN = 105;
      int a[MAXN];
      int n = 1, x = 0;
      //
      //注意头疼的边界问题
      //
      while (scanf("%d", &x) == 1)
      {
            a[n - 1] = x;
            n++;
      }
      for (int i = n-2; i >0; i--)
            printf("%d ", a[i]);

      printf("%d", a[0]);

      return 0;
}

介绍两个数组操作的常用函数:

  1. 数组不能直接如同 b = a 般赋值。需要用到<string.h>中的 memcpy(b, a, sizeof(int) * k)。从数组 a 赋值 k 个元素到数组 b

  2.memset(a, 0, sizeof(a)) 作用是把 a 数组清零。

应用

#include<stdio.h>
#include<string.h>
int main()
{
      int a[5], b[10];
      //使用memset()函数将 a 数组清零
      memset(a, 0, sizeof(a));
      //遍历输出
      for (int i =0; i < 5; i++)
            printf("%d ", a[i]);

      int x;

      for (int i = 0; i < 5; i++)
      {
            scanf("%d", &x);
            a[i] = x;
      }

      for (int i =0; i < 5; i++)
            printf("%d ", a[i]);

      memset(b, 0, sizeof(b));
      for (int i =0; i < 10; i++)
            printf("%d ", b[i]);

      //应用memcpy()函数,将 a 数组中元素的值复制到 b 数组中
      memcpy(b, a, sizeof(a));

      for (int i =0; i < 10; i++)
            printf("%d ", b[i]);

      return 0;
}

 

 

例题 3-2 开灯问题

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

  样例输入:

    7 3

  样例输出:

    1 5 6 7

程序 3-2 开灯问题

#include<stdio.h>
#include<string.h>
int a[1005];

int main()
{
      //根据题意,有 n 盏灯,一共有 k 人
      int k = 0, n = 0;
      scanf("%d%d", &n, &k);

      //技巧: 为了避免输出多余的空格,设置一个标志变量 first ,可以表示当前要输出的变量是否为第一个。第一个变量前面不加空格
      int first = 1;
      //数组置零
      memset(a, 0, sizeof(a));

      //第一人先将所有灯打开,状态为 1 舍弃 a[0] 使之与实际对应
      for (int i = 1; i <= n; i++)
            a[i] = 1;

      //j 代表第几人, 从第二个人开始
      for (int j = 2; j <= k; j++)
            //k 代表第几盏灯
            for (int k = 1; k <= n; k++)
            {
                  //判断 k 是否为第几人的倍数,是 则 改变状态
                  if (k % j == 0)
                  a[k] = !a[k];
            }

      //输出值不为 0 的数组元素下标,与现实中的第几盏灯对应
      for (int i = 1; i <= n; i++)
      {
            if (a[i])
            {
                  //是否为第一个输出
                  if (first)
            {
                  printf("%d", i);
                  first = 0;
            }
            else
            {
                  printf(" ");
                  printf("%d", i);
            }
            }

      }

            return 0;
}

 

 

 

 

 

posted @ 2015-07-10 15:38  Traim304  阅读(131)  评论(0编辑  收藏  举报