数据的储存习题

简介: 数据的储存习题

1 知识点

(1)CPU在计算的时候,以整形的形式进行相加。c=a+b,无论a,b是什么形式,都按照整形的形式相加,不是整形的要发生整形提升,最后的结果要看c的类型。(知识点在详解操作符)

(2)大端正着放,小端倒着放。

(3)大小端字节序指的是数据在电脑上存储的字节顺序。

2 在屏幕上打印杨辉三角。

1

1 1

1 2 1

1 3 3 1

……

代码展示:

1. #include <stdio.h>
2. int main()
3. {
4.  int arr[10][10] = { 0 };
5.  int i = 0;
6.  int j = 0;
7.  for (i = 0; i < 10; i++)
8.  {
9.    for (j = 0; j <= i; j++)
10.     {
11.       if (j == 0)
12.       {
13.         arr[i][j] = 1;
14.       }
15.       if (j == i)
16.       {
17.         arr[i][j] = 1;
18.       }
19.       if (i >= 2 && j >= 1)
20.       {
21.         arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
22.       }
23.       printf("%d ", arr[i][j]);
24.     }
25.     printf("\n");
26.   }
27.   return 0;
28. }

打印结果:

思路:

可以依赖二维数组。

3 利用ascii值 解决问题

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词:A说:不是我。B说:是C。C说:是D。D说:C在胡说  已知3个人说了真话,1个人说的是假话。现在请根据这些信息,写一个程序来确定到底谁是凶手。

代码展示:

1. #include <stdio.h>
2. int main()
3. {
4.  char killer = 'a';
5.  for (killer = 'a'; killer <= 'd'; killer++)
6.  {
7.    if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3)
8.    {
9.      printf("%c", killer);
10.     }
11.   }
12.   return 0;
13. }

打印结果:c

思路:利用字符在内存中存储的是ascii值,是连续的。

4 猜名次

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一; 比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

代码展示

1. #include <stdio.h>
2. int main()
3. {
4.  int a = 0;
5.  int b = 0;
6.  int c = 0;
7.  int d = 0;
8.  int e = 0;
9.  for (a = 0; a <= 5; a++)
10.   {
11.     for (b = 0; b <= 5; b++)
12.     {
13.       for (c = 0; c <= 5; c++)
14.       {
15.         for (d = 0; d <= 5; d++)
16.         {
17.           for (e = 0; e <= 5; e++)
18.           {
19.             if (((b == 2) + (a == 3) == 1) && ((b == 2) + (e == 4) == 1) && ((c == 1) + (d == 2) == 1) && ((c == 5) + (d == 3) == 1) && ((e == 4) + (a == 1)==1))
20.             {
21.               if (a * b * c * d * e == 120)
22.               {
23.                 printf("a= %d b = %d c = %d d = %d e = %d", a, b, c, d, e);
24.               }
25.             }
26.           }
27.         }
28.       }
29.     }
30.   }
31.   return 0;
32. }

打印结果:a=  3 b = 1 c =  5 d = 2 e =  4

解析:如果 第二个if不加上的话,就会出现多种情况。会出现名次相同的情况。

5 改数字

小乐乐喜欢数字,尤其喜欢0和1。他现在得到了一个数,想把每位的数变成0或1。如果某一位是奇数,就把它变成1,如果是偶数,那么就把它变成0。请你回答他最后得到的数是多少

输入:123   输出:101;   输入:222222    输出:0

审题:注意修改前是数字,修改后也是数字。

代码展示:

1. #include <math.h>
2. #include <stdio.h>
3. int main()
4. {
5.  //输入
6.  int a = 0;
7.  scanf("%d", &a);
8.  //计算
9.  int tmp = 0;
10.   int i = 0;
11.   int b = 0;
12.   int sum = 0;
13.   while (a)
14.   {
15.     tmp = a % 10;
16.     if (tmp % 2 == 0)
17.       tmp = 0;
18.     else
19.       tmp = 1;
20.     b = tmp * pow(10, i++);
21.     sum = sum + b;
22.     a = a / 10;
23.   }
24.   //输出
25.   printf("%d", sum);
26.   return 0;
27. }

思路:每一位的数字 换成相应的数字之后,可以乘以10^n,最低位乘以10^0,然后10^1以此类推。

6 小乐乐走台阶

小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?输入包含一个整数n (1 ≤ n ≤ 30)       输出一个整数,即小乐乐可以走的方法数

代码展示:

1. #include <stdio.h>
2. int fib(int n)
3. {
4.  if (n == 1)
5.  {
6.    return 1;
7.  }
8.  else if (n == 2)
9.  {
10.     return 2;
11.   }
12.   else
13.   {
14.     return fib(n - 1) + fib(n - 2);
15.   }
16. }
17. int main()
18. {
19.   int n = 0;
20.   scanf("%d", &n);
21.   int ret = fib(n);
22.   printf("%d", ret);
23.   return 0;
24. }

思路: 和斐波那契数列类似。

7 小乐乐与序列

老师给了小乐乐一个正整数序列,要求小乐乐把这个序列去重后按从小到大排序。但是老师给出的序列太长了,小乐乐没办法耐心的去重并排序,请你帮助他   第一行包含一个正整数n,表示老师给出的序列有n个数。接下来有n行,每行一个正整数k,为序列中每一个元素的值。(1 ≤ n ≤ 105,1 ≤ k ≤ n)    输出一行,为去重排序后的序列,每个数后面有一个空格。

输入:                                                 输入

4                                                        5

2                                                        5

2                                                         4

1                                                        3

1                                                       2

输出:1 2                                         1

                                                        输出:1 2 3 4 5

代码展示

1. #include <stdio.h>
2. int main()
3. {
4.  int arr[100001] = { 0 };//因为还有一个数字k
5.  int i = 0;
6.  int n = 0;
7.  int k = 0;
8.  scanf("%d", &n);//输入
9.  for (i = 0; i < n; i++)
10.   {
11.     scanf("%d", &k);
12.     arr[k] = k;
13.   }
14.   for (i = 0; i < 100001; i++)
15.   {
16.     if (arr[i] != 0)
17.       printf("%d ", arr[i]);
18.   }
19.   return 0;
20. }

思路:数组,把数字n放到相应的下标n中。既可以去重,又可以排序。

8 小乐乐排电梯

小乐乐学校教学楼的电梯前排了很多人,他的前面有n个人在等电梯。电梯每次可以乘坐12人,每次上下需要的时间为4分钟(上需要2分钟,下需要2分钟)。请帮助小乐乐计算还需要多少分钟才能乘电梯到达楼上。(假设最初电梯在1层    输入包含一个整数n (0 ≤ n ≤ 109)    输出一个整数,即小乐乐到达楼上需要的时间

代码展示:

1. #include <stdio.h>
2. int main()
3. {
4.  int n = 0;
5.  scanf("%d", &n);
6.  int num = (n / 12) * 4 + 2;
7.  printf("%d", num);
8. }

理解:当轮到小乐乐的时候,仅仅需要2分钟就行,

9 矩阵转置

KiKi有一个矩阵,他想知道转置后的矩阵(将矩阵的行列互换得到的新矩阵称为转置矩阵),请编程帮他解答    第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10)从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素                     输出m行n列,为矩阵转置后的结果。每个数后面有一个空格。

输入:

2 3

1 2 3

4 5 6

输出:

1 4

2 5

3 6

代码展示:

1. #include <stdio.h>
2. int main()
3. {
4.  int n = 0;
5.  int m = 0;
6.  scanf("%d %d", &n, &m);
7.  int arr[n][m];
8.  int i = 0;
9.  int j = 0;
10.   for (i = 0; i < n; i++)
11.   {
12.     for (j = 0; j < m; j++)
13.     {
14.       scanf("%d", &arr[i][j]);
15.     }
16.   }
17.   for (i = 0; i < m; i++)
18.   {
19.     for (j = 0; j < n; j++)
20.     {
21.       printf("%d ", arr[j][i]);
22.     }
23.     printf("\n");
24.   }
25.   return 0;
26. }

数组名不能用变量,c99除了一个新的概念,变长数组。所以是可以的。

如果编译器不允许,可以用以下代码:

1. #include <stdio.h>
2. int main()
3. {
4.  int arr[10][10] = { 0 };
5.  int n = 0;
6.  int m = 0;
7.  scanf("%d %d", &n, &m);
8.  int i = 0;
9.  int j = 0;
10.   for (i = 0; i < n; i++)
11.   {
12.     for (j = 0; j < m; j++)
13.     {
14.       scanf("%d", &arr[i][j]);
15.     }
16.   }
17.   for (i = 0; i < m; i++)
18.   {
19.     for (j = 0; j < n; j++)
20.     {
21.       printf("%d ", arr[j][i]);
22.     }
23.     printf("\n");
24.   }
25.   return 0;
26. }

10 序列中删除指定数字

有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。数据范围:序列长度和序列中的值都满足 1≤n≤501 \le n \le 501≤n≤50

第一行输入一个整数(0≤N≤50)。第二行输入N个整数,输入用空格分隔的N个整数。第三行输入想要进行删除的一个整数。

输出为一行,删除指定数字之后的序列

输入:

6

1 2 3 4 5 9

4

输出:

1 2 3 5 9

代码展示:

1. #include <stdio.h>
2. int main()
3. {
4.  int n = 0;
5.  scanf("%d", &n);
6.  int arr[50] = { 0 };
7.  int i = 0;
8.  for (i = 0; i < n; i++)
9.  {
10.     scanf("%d", &arr[i]);
11.   }
12.   int del = 0;
13.   scanf("%d", &del);
14.   int j = 0;//存放,并打印的数组
15.   for (i = 0; i < n; i++)
16.   {
17.     if (arr[i] != del)
18.     {
19.       arr[j] = arr[i];
20.       j++;
21.     }
22.   }
23.   for (i = 0; i < j; i++)
24.   {
25.     printf("%d ", arr[i]);
26.   }
27.   return 0;
28. }


相关文章
|
4月前
【数据结构OJ题】消失的数字
力扣题目——消失的数字
44 0
【数据结构OJ题】消失的数字
|
5月前
|
开发框架 .NET
技术好文共享:面试题:找出数组中只出现一次的2个数(异或的巧妙应用)(出现3次)
技术好文共享:面试题:找出数组中只出现一次的2个数(异或的巧妙应用)(出现3次)
|
6月前
|
算法 C语言
计算机简单算法举例
计算机简单算法举例
27 1
|
6月前
|
存储 算法
【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
46 0
|
6月前
|
人工智能 算法 BI
【经典问题】给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
【1月更文挑战第26天】【经典问题】给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
|
存储 小程序 编译器
整数在内存中原来是这样存储的,看完表示头好痒,感觉要长脑子了!
整数在内存中原来是这样存储的,看完表示头好痒,感觉要长脑子了!
|
存储
学C的第二十三天【继续深度剖析数据在内存中的存储:3. 浮点型在内存中的存储(重点);练习:1. 有序序列判断;2. 获得月份天数(多组输入);3. 使用指针打印数组内容;4. 使用指针使字符串逆序】-2
(4). 取出内存中的 指数E(三种情况):E全为1 指数E 是通过 真实值+中间值 算出来的,如果E全是1,(32位系统)说明E的真实值是 128,指数是128说明这个值是非常大的。 这时,如果 有效数字M 全为0,表示 ±无穷大(正负取决于符号位s)
|
存储 小程序
练习题——整型数据在内存中的存储
练习题——整型数据在内存中的存储