考研机试真题--浮点数加法--北京大学

该博客介绍了如何处理考研机试中浮点数加法问题,通过将浮点数转化为字符串并进行大整数加法来求解。题目规定输入输出的浮点数具有特定格式,且输出保证小数部分不为零。示例展示了两个相同浮点数相加的结果。链接提供了题目详情和在线练习平台。

关键字:浮点数加法,可以用字符串处理一下,转换成大整数加法

题目:
求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2…Pi.Q1Q2…Qj 对于整数部分,P1P2…Pi是一个非负整数 对于小数部分,Qj不等于0
输入描述:
对于每组案例,每组测试数据占2行,分别是两个加数。
输出描述:
每组案例是n行,每组测试数据有一行输出是相应的和。
输出保证一定是一个小数部分不为0的浮点数
示例1
输入
0.111111111111111111111111111111
0.111111111111111111111111111111
输出
0.222222222222222222222222222222

链接:
https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8?tpId=40&tqId=21410&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking

代码:

#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
using namespace std;
const int maxn = 1010;


int main(){
//    freopen("a.txt", "r", stdin);
    string s1, s2;
    int i, j;
    while(cin >> s1 >> s2){
        int d1[maxn] = {0}, d2[maxn] = {0}, f1[maxn] = {0}, f2[maxn] = {0}, sumf[maxn] = {0}, sumd[maxn] = {0}, tmp[maxn] = {0};
        int len1 = s1.length(), len2 = s2.length();
        int d1cnt = 0, d2cnt = 0, f1cnt = 0, f2cnt = 0;

        for(i = 0; i < len1; ++i){
            if(s1[i] == '.') break;
            tmp[d1cnt++] = s1[i] - '0';
        }
        for(j = 0; j < i; ++j){
            d1[j] = tmp[d1cnt - 1 - j];
        }
        for(++i; i < len1; ++i){
            f1[f1cnt++] = s1[i] - '0';
        }


        for(i = 0; i < len2; ++i){
            if(s2[i] == '.') break;
            tmp[d2cnt++] = s2[i] - '0';
        }
        for(j = 0; j < i; ++j){
            d2[j] = tmp[d2cnt - 1 - j];
        }
        for(++i; i < len2; ++i){
            f2[f2cnt++] = s2[i] - '0';
        }

//        计算小数部分
        int maxL2 = max(f1cnt, f2cnt);
        int carry = 0;
        for(i = maxL2 - 1; i >= 0; --i){
            sumf[i] = (carry + f1[i] + f2[i]) % 10;
            carry = (carry + f1[i] + f2[i]) / 10;
        }

//        计算整数部分
        int maxL1 = max(d1cnt, d2cnt);
        for(i = 0; i < maxL1; ++i){
            sumd[i] = (carry + d1[i] + d2[i]) % 10;
            carry = (carry + d1[i] + d2[i]) / 10;
        }
        if(carry > 0){
            sumd[maxL1++] = carry;
        }
        for(i = maxL1 - 1; i >= 0; --i){
            cout << sumd[i];
        }
        cout << ".";
        for(i = 0; i < maxL2; ++i){
            cout << sumf[i];
        }
        cout << endl;

    }
}
### 关于北京邮电大学计算组成原理课程的相关作业资料 #### 资料概述 北京邮电大学的计算组成原理课程通常会涉及教材中的经典习以及历年考研真题作为练习材料。这些目主要来源于指定教材《计算组成原理》(白中英版本),并可能结合其他参考资料进行补充[^1]。 以下是基于已知引用内容整理的一些典型目及其解答方向: --- #### 经典课后习示例 ##### 第一章 基础概念 1. **问描述**: 解释冯·诺依曼体系结构的特点。 - 冯·诺依曼体系结构的核心特点包括程序存储和数据存储统一管理、按地址访问指令与数据、顺序执行指令流等特性。 2. **代码实现**: 编写一段伪代码展示如何通过寄存器完成简单的加法运算。 ```assembly LOAD R1, A ; 将A加载到寄存器R1 LOAD R2, B ; 将B加载到寄存器R2 ADD R3, R1, R2; 将R1和R2相加,结果存入R3 STORE C, R3 ; 将R3的结果存储回内存C位置 ``` --- ##### 第二章 数据表示与运算 1. **问描述**: 已知某器字长为8位,采用补码形式表示整数,请计算十进制-79对应的二进制补码。 - 十进制-79转换成二进制原码为`11001111`,取反加一则得到其补码为`10110001`。 2. **扩展思考**: 如果该器支持浮点数IEEE 754标准单精度格式,写出数值`-12.5`的具体编码过程。 - IEEE 754单精度浮点数由符号位S、指数E和尾数M构成。对于`-12.5`: - 符号位S=1; - 数值规范化后的科学计数表达式为`(-1)*1.5625*2^3`; - 指数偏移量为127,则实际存储指数为`130(即10000010)`; - 尾数部分去掉隐含最高有效位后为`0.5625`,转化为二进制序列填充至23位长度即可。 --- ##### 第三章 存储系统 1. **问描述**: 设定主存容量为1MB,块大小为1KB,Cache共有16行,采用直接映射方式工作,请问有多少个不同的主存单元可以被缓存在同一Cache行? - 主存每一块占据连续空间大小等于块尺寸,因此整个主存划分为\( \frac{1MB}{1KB}=1024\)块;而Cache仅有16行可用作索引定位,所以每个特定Cache行对应\( \frac{1024}{16} = 64\)种不同可能性。 --- #### 实验类目设计思路 除了理论性的笔外,《微型计算原理及应用阶段作业》也提供了丰富的实践型案例供学生动手操作[^4]。例如利用汇编语言编写小程序测CPU性能指标或者验证某些硬件电路逻辑功能正确性等方面均有所涉猎。 --- ### 结论总结 综上所述,在准备北京邮电大学关于“计算组成原理”的相关内容复习过程中,建议重点围绕官方推荐书籍章节后面的配套练习展开深入学习,并适当参考历年研究生入学考大纲范围内的综合性难加以巩固提升[^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值