数据的储存习题

目录

1 知识点

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

3 利用ascii值 解决问题

4 猜名次

5 改数字

6 小乐乐走台阶

7 小乐乐与序列

8 小乐乐排电梯

9 矩阵转置

10 序列中删除指定数字


1 知识点

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

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

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

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

1

1 1

1 2 1

1 3 3 1

……

代码展示:

#include <stdio.h>
int main()
{
	int arr[10][10] = { 0 };
	int i = 0;
	int j = 0;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j <= i; j++)
		{
			if (j == 0)
			{
				arr[i][j] = 1;
			}
			if (j == i)
			{
				arr[i][j] = 1;
			}
			if (i >= 2 && j >= 1)
			{
				arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
			}
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

打印结果:

思路:

可以依赖二维数组。

3 利用ascii值 解决问题

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

代码展示:

#include <stdio.h>
int main()
{
	char killer = 'a';
	for (killer = 'a'; killer <= 'd'; killer++)
	{
		if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3)
		{
			printf("%c", killer);
		}
	}
	return 0;
}

打印结果:c

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

4 猜名次

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

代码展示

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	int d = 0;
	int e = 0;
	for (a = 0; a <= 5; a++)
	{
		for (b = 0; b <= 5; b++)
		{
			for (c = 0; c <= 5; c++)
			{
				for (d = 0; d <= 5; d++)
				{
					for (e = 0; e <= 5; e++)
					{
						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))
						{
							if (a * b * c * d * e == 120)
							{
								printf("a= %d b = %d c = %d d = %d e = %d", a, b, c, d, e);
							}
						}
					}
				}
			}
		}
	}
	return 0;
}

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

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

5 改数字

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

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

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

代码展示:

#include <math.h>
#include <stdio.h>
int main()
{
	//输入
	int a = 0;
	scanf("%d", &a);
	//计算
	int tmp = 0;
	int i = 0;
	int b = 0;
	int sum = 0;
	while (a)
	{
		tmp = a % 10;
		if (tmp % 2 == 0)
			tmp = 0;
		else
			tmp = 1;
		b = tmp * pow(10, i++);
		sum = sum + b;
		a = a / 10;
	}
	//输出
	printf("%d", sum);
	return 0;
}

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

6 小乐乐走台阶

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

代码展示:

#include <stdio.h>
int fib(int n)
{
	if (n == 1)
	{
		return 1;
	}
	else if (n == 2)
	{
		return 2;
	}
	else
	{
		return fib(n - 1) + fib(n - 2);
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fib(n);
	printf("%d", ret);
	return 0;
}

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

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

代码展示

#include <stdio.h>
int main()
{
	int arr[100001] = { 0 };//因为还有一个数字k
	int i = 0;
	int n = 0;
	int k = 0;
	scanf("%d", &n);//输入
	for (i = 0; i < n; i++)
	{
		scanf("%d", &k);
		arr[k] = k;
	}
	for (i = 0; i < 100001; i++)
	{
		if (arr[i] != 0)
			printf("%d ", arr[i]);
	}
	return 0;
}

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

8 小乐乐排电梯

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

代码展示:

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

理解:当轮到小乐乐的时候,仅仅需要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 

代码展示:

#include <stdio.h>
int main()
{
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	int arr[n][m];
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			printf("%d ", arr[j][i]);
		}
		printf("\n");
	}
	return 0;
}

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

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

#include <stdio.h>
int main()
{
	int arr[10][10] = { 0 };
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			printf("%d ", arr[j][i]);
		}
		printf("\n");
	}
	return 0;
}

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

代码展示:

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[50] = { 0 };
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	int del = 0;
	scanf("%d", &del);
	int j = 0;//存放,并打印的数组
	for (i = 0; i < n; i++)
	{
		if (arr[i] != del)
		{
			arr[j] = arr[i];
			j++;
		}
	}
	for (i = 0; i < j; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_57388581/article/details/123970811