6.A+B(Ⅰ)

题目

Description

学过《计算机科学导论》的你应该熟悉“二进制运算”吧?

和十进制不同的是:二进制运算“逢二进一”。下面举一个二进制加法的运算实例:

   11101
+    110
--------
  100011

下面请你模拟这个过程。

Input

第一行输入一个正整数T,表示接下来有T组数据;

接下来T行,每组输入两个二进制串a和b,中间用空格隔开,保证它们长度并且没有前导0。

Output

对于每组数据,请按模拟二进制加法,按题目描述的格式输出正确的运算结果,注意换行,没有多余的空格和换行。

思路

思路:本想二进制转十进制,相加再转二进制,但是没注意到数据的大小(不是10^5, 而是2^10^5)。故应该用两个数组倒序存储数据,之后相加。注意char与int相加的区别。

小坑:注意数据大小,相加的情况要考虑全,打印的格式问题。

改进:可以使用函数简写正存、倒叙、打印部分。

代码

#include<stdio.h>
#include<string.h>
#include<math.h>
char arr1[1000010]={0};
char arr2[1000010]={0};
char arr3[1000010]={0};
int main()
{
	int t = 0; 
	int wei1,wei2,wei3;
	scanf("%d",&t) ;
	char ch; ch = getchar();
	while(t--)//t组用例 
	{
		for(wei1 = 0;wei1 < 1000010; wei1++)//正存1 
		{
			ch = getchar();
			if(ch ==' ') break;
			arr1[wei1] = ch;
		}
		for(wei2 = 0;wei2 < 1000010; wei2++)//正存2 
		{
			ch = getchar();
			if(ch == '\n') break;
			arr2[wei2] = ch;
		}
		for(int i = 0; i < wei1/2; i++)//倒存1 
		{
			char m = arr1[wei1-1-i];
			arr1[wei1-1-i] = arr1[i] ;
			arr1[i] = m;
		}
		for(int i = 0; i < wei2/2; i++)//倒存2 
		{
			char m = arr2[wei2-1-i];
			arr2[wei2-1-i] = arr2[i];
			arr2[i] = m;
		}
		
		(wei1>wei2)?(wei3=wei1):(wei3=wei2);//算 
		for(int i = 0; i < wei3+1; i++)
		{
			char c = arr1[i]+arr2[i]+arr3[i];
			if(c==96||c==48) arr3[i]='0'; 
			else if(c==97||c==49) arr3[i]='1';
			else if(c==98||c=='2'||c==-110) 
			{
				arr3[i] = '0';arr3[i+1] = '1';
			}
			else if(c==99||c==-109) 
			{
				arr3[i] = '1';arr3[i+1] = '1';
			}
		}
			if(arr3[wei3] == 49) wei3++;
			
	   		int j = 0;//打印 
			for(int i = 0; i < wei3+2; i++)
			{	
				if(i<wei3+2-wei1) printf(" ");
				else  
				{   
					printf("%c",arr1[wei1-1-j]); j++;
				}
			 } printf("\n");  j = 0;
			for(int i = 0; i < wei3+2; i++)
			{	
				if(i == 0) printf("+");
				else if(i < wei3+2-wei2) printf(" ");
				else  
				{
					printf("%c",arr2[wei2-1-j]); j++;
				}
			 } printf("\n");
			for(int i = 0; i < wei3+2 ;i++) 
			{
				printf("-");
			}printf("\n");printf(" ");printf(" ");
			for(int i = 0; i < wei3; i++) 
			{
				printf("%c",arr3[wei3-1-i]);
			}printf("\n");
	for(int i = 0; i < 1000010; i++)//重置 
	{
		arr1[i] = 0;arr2[i] = 0;arr3[i] = 0;
	}	
	}
	return 0;
}

循环队列存储在数组A[0..n-1]中,其头尾指针分别为f和r,头指针f总是指向队头元素,尾指针r总是指向队尾元素的下一个位置,假设队列不空,元素出队时头尾指针的操作为( )。 undefined A. f=(f+1)%n undefined B. f=f+1 undefined C. r=(r+1)%n undefined D. f=(f+1)%(n-1) 2-3 分数 2 作者 DS课程组 单位 临沂大学 设循环队列中数组的下标范围是0—n-1,其头尾指针分别为front和rear,头指针front总是指向队头元素,尾指针rear总是指向队尾元素的下一个位置,则其元素的个数为( ) undefined A. rear-front undefined B. rear-front+1 undefined C. (rear-front)%n+1 undefined D. (rear-front+n) %n 2-4 分数 2 作者 DS课程组 单位 临沂大学 设循环队列中数组的下标范围是0—n,其头尾指针分别为front和rear,头指针front总是指向队头元素,尾指针rear总是指向队尾元素的下一个位置,则其元素的个数为( )。 undefined A. rear-front undefined B. rear-front+1 undefined C. (rear-front+n+1)%(n+1) undefined D. (rear-front+n) %n 2-5 分数 2 作者 DS课程组 单位 临沂大学 设循环队列中数组的下标范围是0—n-1,其头尾指针分别为f和r,头指针f总是指向队头元素,尾指针r总是指向队尾元素的下一个位置,则队满的条件为( )。 undefined A. (r+1)%n==f undefined B. r==f undefined C. r+1==f undefined D. (r-l)%n==f 2-6 分数 2 作者 王俊玲 单位 集美大学 在一个链表表示的队列中, f和r分别指向队列的头和尾。下列哪个操作能正确地将s结点插入到队列中: undefined A. f->next=s; f=s; undefined B. r->next=s; r=s; undefined C. s->next=r; r=s; undefined D. s->next=f; f=s; 2-7 分数 2 作者 王东 单位 贵州师范学院 用链接方式存储的队列,在进行删除运算时( )。 undefined A. 仅修改头指针 undefined B. 仅修改尾指针 undefined C. 头、尾指针都要修改 undefined D. 头、尾指针可能都要修改 2-8 分数 2 作者 王东 单位 贵州师范学院 最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是( )。 undefined A. (rear+1)%n==front undefined B. rear==front undefined C. rear+1==front undefined D. (rear-l)%n==front 2-9 分数 2 作者 王东 单位 贵州师范学院 队列的“先进先出”特性是指( )。 Ⅰ.最后插入队列中的元素总是最后被删除 Ⅱ.当同时进行插入、删除操作时,总是插入操作优先 Ⅲ.每当有删除操作时,总要先做一次插入操作 Ⅳ.每次从队列中删除的总是最早插入的元素 undefined A. Ⅰ undefined B. Ⅰ、Ⅳ undefined C. Ⅱ、Ⅲ undefined D. Ⅳ 2-10 分数 2 作者 王东 单位 贵州师范学院 已知循环队列的存储空间为数组A[21],front指向队头元素的前一个位置,rear指向队尾元素,假设当前front和rear的值分别为8和3,则该队列的长度为( )。 undefined A. 5 undefined B. 6 undefined C. 16 undefined D. 17 2-11 分数 2 作者 王东 单位 贵州师范学院 若用数组A[0...5]来实现循环队列,且当前rear和front的值分别为1和5,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为( )。 undefined A. 3和4 undefined B. 3和0 undefined C. 5和0 undefined D. 5和1 2-12 分数 2 作者 王东 单位 贵州师范学院 循环队列放在一维数组A[0...M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。初始时为空。下列判断队空和队满的条件中,正确的是( )。 undefined A. 队空:end1==end2;队满:end1==(end2+1)mod M undefined B. 队空:end1==end2;队满:end2==(end1+1)mod (M-1) undefined C. 队空:end2==(end1+1) mod M;队满:end1==(end2+1) mod M undefined D. 队空:end1==(end2+1) mod M;队满:end2==(end1+1)mod (M-1) 2-13 分数 2 作者 严冰 单位 浙江大学 最不适合用作链队的链表是()。 undefined A. 只带队头指针的非循环双链表 undefined B. 只带队头指针的循环双链表 undefined C. 只带队尾指针的循环双链表 undefined D. 只带队尾指针的循环单链表 2-14 分数 2 作者 鲁法明 单位 山东科技大学 undefined A. 2 undefined B. 3 undefined C. 4 undefined D. 5 2-15 分数 2 作者 李廷元 单位 中国民用航空飞行学院 循环队列____。 undefined A. 不会产生溢出 undefined B. 不会产生上溢出 undefined C. 不会产生假溢出 undefined D. 以上都不对 2-16 分数 2 作者 陈翔 单位 浙江大学 Following is the C-like pseudo code of a function that takes a Queue as an argument. void foo(Queue Q) { Stack S = CreateStack(); // create an empty stack while (!IsEmpty(Q)) { // dequeue an item from Q and push it into S Push(S, Dequeue(Q)); } while (!IsEmpty(S)) { // pop an item from S and enqueue it into Q Enqueue(Q, Pop(S)); } DisposeStack(S); } 收起 放大 全屏 复制 What does the above function do? undefined A. Removes the last item from Q undefined B. Keeps Q unchanged undefined C. Makes Q empty undefined D. Reverses Q 2-17 分数 2 作者 陈翔 单位 浙江大学 Following is the C-like pseudo code of a function that takes a Queue as an argument. void foo(Queue Q) { Queue Q1 = CreateQueue(); // create an empty queue while (!IsEmpty(Q)) { // dequeue an item from Q and enqueue it into Q1 Enqueue(Q1, Dequeue(Q)); } while (!IsEmpty(Q1)) { // dequeue an item from Q1 and enqueue it into Q Enqueue(Q, Dequeue(Q1)); } DisposeQueue(Q1); } 收起 放大 全屏 复制 What does the above function do? undefined A. Removes the last item from Q undefined B. Keeps Q unchanged undefined C. Makes Q empty undefined D. Reverses Q 2-18 分数 2 作者 王俊玲 单位 集美大学 现采用大小为10的数组实现一个循环队列。设在某一时刻,队列为空且此时front和rear值均为5。经过若干操作后,front为8,rear为2,问:此时队列中有多少个元素? undefined A. 4 undefined B. 5 undefined C. 6 undefined D. 7 2-19 分数 2 作者 张泳 单位 浙大城市学院 栈和队列的共同点是( ) undefined A. 都是先进后出 undefined B. 都是后进先出 undefined C. 只允许在端点处插入和删除元素 undefined D. 没有共同点
最新发布
11-03
![](https://cdn.luogu.com.cn/upload/image_hosting/unknown.png) > **说明**:本题集为多道关于队列(尤其是循环队列)的基础选择题,涉及指针操作、队列长度计算、队空/队满判断、链队操作及队列性质等。以下按顺序逐一解答并归纳知识点。 --- ### 题目重述 **2-2** 循环队列存储在数组 $ A[0..n-1] $ 中,头尾指针分别为 $ f $ 和 $ r $,头指针 $ f $ 指向队头元素,尾指针 $ r $ 指向队尾元素的下一个位置。队列不空,元素出队时头尾指针的操作为( ) A. $ f = (f+1)\%n $ B. $ f = f+1 $ C. $ r = (r+1)\%n $ D. $ f = (f+1)\%(n-1) $ --- ### 答案 $$ \text{A} $$ --- ### 详解 出队发生在队头,需移动头指针 $ f $ 指向下一个元素。由于是**循环结构**,必须使用模运算防止越界: $$ f = (f + 1) \% n $$ 选项 B 忽略循环性,会越界;C 修改了 rear,错误;D 取模 $ n-1 $ 错误。 --- --- ### 题目重述 **2-3** 循环队列下标范围 $ 0 $ 至 $ n-1 $,头指针 front 指向队头元素,rear 指向队尾元素的下一位置,则元素个数为( ) A. $ \text{rear} - \text{front} $ B. $ \text{rear} - \text{front} + 1 $ C. $ (\text{rear} - \text{front}) \% n + 1 $ D. $ (\text{rear} - \text{front} + n) \% n $ --- ### 答案 $$ \text{D} $$ --- ### 详解 队列中元素个数公式为: $$ (\text{rear} - \text{front} + n) \% n $$ 因为 rear 可能小于 front(循环绕回),直接相减为负,加 $ n $ 后取模保证结果非负。 例如:$ n=6, \text{front}=4, \text{rear}=2 $,则个数为 $ (2-4+6)\%6 = 4 $。 --- --- ### 题目重述 **2-4** 循环队列下标范围 $ 0 $ 至 $ n $,共 $ n+1 $ 个位置,front 和 rear 定义同上,求元素个数。 A. $ \text{rear} - \text{front} $ B. $ \text{rear} - \text{front} + 1 $ C. $ (\text{rear} - \text{front} + n + 1) \% (n + 1) $ D. $ (\text{rear} - \text{front} + n) \% n $ --- ### 答案 $$ \text{C} $$ --- ### 详解 此时数组大小为 $ n+1 $,所以模数应为 $ n+1 $。通用公式为: $$ (\text{rear} - \text{front} + (n+1)) \% (n+1) $$ 对应选项 C。 --- --- ### 题目重述 **2-5** 循环队列下标 $ 0..n-1 $,f 指向队头,r 指向队尾后一位,队满条件为( ) A. $ (r+1)\%n == f $ B. $ r == f $ C. $ r+1 == f $ D. $ (r-1)\%n == f $ --- ### 答案 $$ \text{A} $$ --- ### 详解 注意题干说“r 指向队尾元素的下一个位置”,则再下一个位置就是 $ (r+1)\%n $。当它等于 $ f $ 时,表示无空位,即队满: $$ (r + 1) \% n == f $$ 这是标准判满条件(牺牲一个空间)。 --- --- ### 题目重述 **2-6** 链表队列中,f 和 r 分别指向头尾结点,如何将 s 插入队列? A. $ f->next=s; f=s; $ B. $ r->next=s; r=s; $ C. $ s->next=r; r=s; $ D. $ s->next=f; f=s; $ --- ### 答案 $$ \text{B} $$ --- ### 详解 链队插入在队尾进行: 1. 当前尾结点 $ r $ 的 next 指向新节点 $ s $ 2. 尾指针更新:$ r = s $ 故操作为: ```c r->next = s; r = s; ``` 选项 B 正确。 --- --- ### 题目重述 **2-7** 链式队列删除时( ) A. 仅修改头指针 B. 仅修改尾指针 C. 头尾都要改 D. 头尾指针可能都要修改 --- ### 答案 $$ \text{D} $$ --- ### 详解 一般情况下删除只改头指针 $ f = f->next $。 但当**队列只有一个元素**时,删除后队列为空,此时**尾指针也需置空或调整**。 因此头尾指针都**可能**被修改。 --- --- ### 题目重述 **2-8** 最大容量为 $ n $ 的循环队列,rear 和 front 分别为队尾和队头指针,则队空条件是( ) A. $ (rear+1)\%n == front $ B. $ rear == front $ C. $ rear+1 == front $ D. $ (rear-1)\%n == front $ --- ### 答案 $$ \text{B} $$ --- ### 详解 无论何种循环队列实现,**队空条件均为**: $$ \text{rear} == \text{front} $$ 而 $ (rear+1)\%n == front $ 是队满条件(牺牲一个空间时)。 --- --- ### 题目重述 **2-9** 队列“先进先出”特性是指: Ⅰ. 最后插入的元素最后被删除 Ⅱ. 插入优先于删除 Ⅲ. 删除前必须先插入 Ⅳ. 删除的总是最早插入的 A. Ⅰ B. Ⅰ、Ⅳ C. Ⅱ、Ⅲ D. Ⅳ --- ### 答案 $$ \text{B} $$ --- ### 详解 “先进先出”意味着: - 早入队 → 早出队 ⇒ Ⅳ正确 - 晚入队 → 晚出队 ⇒ Ⅰ正确 - Ⅱ、Ⅲ 属于误解,无此强制顺序 所以选 **B. Ⅰ、Ⅳ** --- --- ### 题目重述 **2-10** 循环队列空间为 $ A[21] $,front 指向队头前一个位置,rear 指向队尾元素,当前 front=8,rear=3,求队列长度。 A. 5 B. 6 C. 16 D. 17 --- ### 答案 $$ \text{C} $$ --- ### 详解 注意指针定义不同: - front 指向队头前一个 ⇒ 实际队头在 $ (front + 1)\%21 $ - rear 指向队尾元素 ⇒ 包含该元素 元素个数计算公式为: $$ (\text{rear} - \text{front} + 21) \% 21 = (3 - 8 + 21) \% 21 = 16 $$ --- --- ### 题目重述 **2-11** 数组 $ A[0..5] $ 实现循环队列,当前 rear=1,front=5。删除一个元素,再插入两个元素后,rear 和 front 的值为? A. 3 和 4 B. 3 和 0 C. 5 和 0 D. 5 和 1 --- ### 答案 $$ \text{A} $$ --- ### 详解 数组长 6,初始: - front=5,rear=1 **删除一个元素**:front 移动 $$ \text{front} = (5 + 1) \% 6 = 0 $$ **插入两个元素**:rear 移动两次 第一次:$ (1 + 1)\%6 = 2 $ 第二次:$ (2 + 1)\%6 = 3 $ 最终:front=0,rear=3?不对! 等等——题目选项无 (3,0),重新审视常见模型。 更正:若 front 指向队头元素,rear 指向队尾下一位置: 初始:front=5,rear=1 删除一个 → front 后移:$ (5+1)\%6 = 0 $ 插入第一个:$ \text{rear} = (1+1)\%6 = 2 $ 插入第二个:$ \text{rear} = (2+1)\%6 = 3 $ ⇒ front=0, rear=3 → 不在选项中? 检查选项 A: 3 和 4?B: 3 和 0?C: 5 和 0?D: 5 和 1? 发现可能是题目设定不同。 再审题:**删除后 front=0,rear=1;插入两个后 rear=(1+2)%6=3** 仍得 (3,0),对应 **B** 但选项 B 是 “3 和 0” ⇒ 即 rear=3, front=0 ✅ 所以答案是 **B** > 原判断失误,修正如下: --- ✅ **更正答案** $$ \text{B} $$ --- ✅ **详解更正** 初始:front=5, rear=1 - 删除一个:$ \text{front} = (5 + 1) \% 6 = 0 $ - 插入两个:$ \text{rear} = (1 + 2) \% 6 = 3 $ 最终:front=0, rear=3 ⇒ 对应选项 B(3 和 0,理解为 rear=3, front=0) --- --- ### 题目重述 **2-12** 循环队列在一维数组 $ A[0..M-1] $,end1 指向队头,end2 指向队尾后一位,最多容纳 $ M-1 $ 个元素,初始为空。 判断队空和队满的条件? A. 队空:end1==end2;队满:end1==(end2+1)%M B. ... C. ... D. ... --- ### 答案 $$ \text{A} $$ --- ### 详解 - 队空:$ \text{end1} == \text{end2} $ - 队满:再插入会使 end2 到达 end1,即: $$ (\text{end2} + 1) \% M == \text{end1} \quad \Rightarrow \quad \text{end1} == (\text{end2} + 1) \% M $$ A 正确。 --- --- ### 题目重述 **2-13** 最不适合用作链队的链表是? A. 只带队头指针的非循环双链表 B. 循环双链表+头指针 C. 循环双链表+尾指针 D. 循环单链表+尾指针 --- ### 答案 $$ \text{A} $$ --- ### 详解 链队需高效实现: - 出队:从头部删除 ⇒ 有头指针即可 - 入队:从尾部插入 ⇒ 若只有头指针且非循环,则无法快速找到尾部 A 无法 $ O(1) $ 找到尾部,效率低,**最不适合** --- --- ### 题目重述 **2-14** (题干缺失,无法判断) --- ### 答案 无法确定 --- --- ### 题目重述 **2-15** 循环队列____。 A. 不会产生溢出 B. 不会产生上溢出 C. 不会产生假溢出 D. 以上都不对 --- ### 答案 $$ \text{C} $$ --- ### 详解 “假溢出”指因顺序存储导致空间未满却无法插入的现象。 循环队列通过**逻辑循环**解决假溢出问题。 但仍可能发生**真溢出**(空间确实满了),所以 A 错。 --- --- ### 题目重述 **2-16** 函数将队列元素依次出队压入栈,再弹出回填队列,作用是? --- ### 答案 $$ \text{D} $$ --- ### 详解 出队顺序为原序列,入栈后反转,再出栈入队 → 得到逆序。 所以队列被**反转**。 --- --- ### 题目重述 **2-17** 函数将 Q 元素搬移到 Q1,再搬回来。 --- ### 答案 $$ \text{B} $$ --- ### 详解 相当于把元素全部转移再恢复,顺序不变,队列保持原样。 --- --- ### 题目重述 **2-18** 大小为 10 的循环队列,初始 front=rear=5(空)。操作后 front=8,rear=2,问元素个数。 A. 4 B. 5 C. 6 D. 7 --- ### 答案 $$ \text{A} $$ --- ### 详解 使用公式: $$ \text{个数} = (\text{rear} - \text{front} + 10) \% 10 = (2 - 8 + 10) \% 10 = 4 $$ --- --- ### 题目重述 **2-19** 栈和队列的共同点是? A. 先进后出 B. 后进先出 C. 只允许在端点处插入删除 D. 没有共同点 --- ### 答案 $$ \text{C} $$ --- ### 详解 栈:只在栈顶操作 队列:入队在队尾,出队在队头 二者均**只允许在端点进行插入删除操作** --- ### 知识点 1. **循环队列长度计算**:使用 $ (\text{rear} - \text{front} + n) \% n $ 避免除负数,确保正确计数。 2. **队空与队满判定**:队空为 $ \text{front} == \text{rear} $;队满为 $ (\text{rear} + 1) \% n == \text{front} $(牺牲一空间)。 3. **链队插入操作**:需维护尾指针,插入时执行 $ r->next = s; r = s; $ 实现 $ O(1) $ 入队。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值