每日一题 | day25(星际密码 | 树根)

Posted WhiteShirtI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题 | day25(星际密码 | 树根)相关的知识,希望对你有一定的参考价值。

选择题

1、以下关于多线程的叙述错误的是:
A 线程同步的方法包括使用临界区,互斥量,信号量等
B 两个线程同时对简单类型全局变量进行写操作也需要互斥
C 实现可重入函数时,对自动变量也要用互斥量加以保护
D 可重入函数不可以调用不可重入函数

正确答案 C:c选项中已经说明是可重入函数了,并且自动变量属于局部变量,加锁会多此一举,降低函数的执行效率。只有存在全局变量时才需要加锁保护

2、使用C语言将一个1G字节的字符数组从头到尾全部设置为字’A’,在一台典型的当代PC上,需要花费的CPU时间的数量级最接近()
A 0.001秒
B 1秒
C 100秒
D 2小时

正确答案 B:现在机器cpu都是GHz,每次需要若干个指令,大约在1秒。

3、对于普通的计算机,对以下事件的平均耗时从小到大排序为____:
A.读取1KB内存数据 B.从硬盘连续读取1KB数据 C.读取一次L2缓存 D.一次磁盘寻道

A C,A,D,B
B C,D,A,B
C D,C,A,B
D D,A,C,B

正确答案 A:各存储器的访问速度由快到慢:L1缓冲->L2缓冲->内存->磁盘->硬盘。

4、分页式虚拟存储管理系统中,页面的大小与可能产生的缺页中断次数( )
A 成正比
B 成反比
C 无关
D 成固定值

正确答案 C:页面大小是右硬件来决定的。选择的页面大小小时,产生的内存碎片就越少,就可以提高内存利用率,但会增加页表长度,占用额外的内存空间,降低页面换进换出的效率。而选择的页面大时,可以减少页表长度,减少对内存的占用,但是内存碎片会增加。由于内存是固定的,进入内存的页面无论大小,容量都是一定的,都不会超过内存的大小,所以缺页中断和页面大小并没有任何关系

5、关于子进程和父进程的说法,下面哪一个是正确的?()
A 一个父进程可以创建若干个子进程,一个子进程可以从属于若干个父进程
B 父进程被撤销时,其所有子进程也被相应撤消
C 子进程被撤销时,其从属的父进程也被撤销
D 一个进程可以没有父进程或子进程

正确答案 D:A选项中一个子进程只能属于一个父进程;B选项中windows在父进程终止时不会强制撤销子进程。C选项中子进程撤销并不会影响父进程。D选项中1号进程(init)没有父进程,我们平时创建的进程没有子进程

编程题

题目1
在这里插入图片描述
解题思路

这道题有两个难点,第一个是题目难理解,第二个是需要一定的数学功底。我们先来理解一下题目,我们可以通过题目给的用例来理解题意
在这里插入图片描述
而且每次相乘都是同一个矩阵。题目理解后我们再来看看矩阵如何相乘,这里直接给出公式如下
在这里插入图片描述
我们再来计算前5个结果
在这里插入图片描述
但是这样计算过程也是非常的繁琐,但是我们可以发现算出来的结果好像满足一个叫斐波那契数列的式子,我们大胆猜测当n=6时,左上角的值为13。这个读者可以下去自行计算。当我们知道结果满足斐波那契数列,题目自然就变得简单了。我们再来看看测试用例,第一行表示的要测试的次数n,第二行表示有n个数。输出时,如果计算结果不够4位前需要补0,如果超过4位则取低4位即可。我们发现一组数据中都需要计算斐波那契数列,此时我们可以用一个数组来保存斐波那契数列,就只要将输入进来的数字作为下标,取出对应的结果即可,这样子我们的斐波那契数列只需要计算一次
代码

#include <iostream>
#include <vector>
using namespace std;

int main()
{

	vector<int> arr = { 0, 1, 2 };//初始化斐波那契数列
	arr.resize(10005);//题目明确说明不会超过10000
	for (int i = 3; i <= arr.size(); ++i)
	{
		arr[i] = arr[i - 1] + arr[i - 2];
		//超过4位模上10000就可以取低4位的数据
		//不超过模10000还是原来的值
		arr[i] %= 10000;
	}

	int n;
	while (cin >> n)
	{
		for (int i = 0; i < n; ++i)
		{
			int num;
			cin >> num;
			//不足4位则前面不0,
			printf("%04d", arr[num]);
		}
		cout << endl;
	}
	return 0;
}

题目2
在这里插入图片描述
题解思路
题目容易理解,但是有一个要注意的是,题目给出的数的范围是非常庞大的,所以我们平时用的int或者long都无法接收
在这里插入图片描述
我们这时可以用一个字符串来接收,然后就直接进行第一次的数根运算

代码

#include<iostream>
#include <string>
using namespace std;

int numRoot(int n)
{
    int sum = 0;//用于保存树根结果
    while (n)
    {
        sum += n % 10;
        n /= 10;
        //计算出树根,但树根不为1位数,则继续计算
        if (n == 0 && sum >= 10)
        {
            n = sum;
            sum = 0;
        }
    }
    return sum;
}
int main()
{
    string str;//用于接收输入的数据
    while (cin >> str)
    {
        int n = 0;
        //直接进行第一次树根运算,也就是每位都进行相加
        for (int i = 0; i < str.size(); ++i)
        {
            n += str[i] - '0';
        }
        cout << numRoot(n) << endl;
    }
    return 0;
}

以上是关于每日一题 | day25(星际密码 | 树根)的主要内容,如果未能解决你的问题,请参考以下文章

每日一题 | day10(井字棋 | 密码强度等级)

阿铭每日一题 day 4 20180114

老男孩教育每日一题-day59-Linux root 密码忘了,如何找回来?

算法·每日一题(详解+多解)-- day14

算法·每日一题(详解+多解)-- day14

AcWing - 蓝桥杯集训每日一题(DAY 1——DAY 5)