0
点赞
收藏
分享

微信扫一扫

目标检测基础

迪莉娅1979 2023-06-24 阅读 50

在这里插入图片描述

文章目录

​前言

为什么不直接利用int、float、double等类型进行存储计算,因为它们是存在有效数据范围的, 比如说int的范围是 -2147483648 ~ 2147483647 字节,数值最多占据10位,8字节的 long int 型的取值范围是-9,223,372,036,854,775,808~9,223,372,036,854,775,807,而如果想存储更大的数字的话,有效范围之内并不能容忍得下,超出的数据就会导致精度的丢失,故而以下解法是针对高精度计算问题,利用数组的每一个元素去模拟数值的位数。😉👇

求2的N次方,N ≤ 10000

在这里插入图片描述
💡

实现思路:

⚠️注:为了方便理解,我们暂时将画图中给定的数值为 12345678912345。本题的实现,注意数组初始化必须为1,才能保证求2的N次幂得到想要的结果。

在这里插入图片描述

代码实现:

😉😉

#include <iostream>
const int N = 3300;
using namespace std;

int main() {
  
    // 最低为数字是1,因为它乘以任何数都是任何数
    int a[N] = {1};
    int n;
    cin >> n;
    //m标记进位完后的位置
    int m = 1;
    // 输入的 n 是 2 的幂次,并非乘数
    for (int i = 0; i < n; i++) {
        int t = 0;
        // 循环内的数字从低位不断被取出,这些数字都从左到右存放,也就是个位数在最左端,每次从数组a中读取个位十位,分别与 2 相乘
        // 运算后把数字存回原数组
        for (int j = 0; j < m; j++) {
            t += a[j] * 2;
            a[j] = t % 10;
            t /= 10;
        }
        // 负责进位,for循环最后一个操作是 t / 10,由于乘以2,最大为19, 因此若商为1,必定进位1
        if (t) a[m++] = 1;
    }
	//m多加了1次,减去1
    for (int i = m - 1; i >= 0; i--) cout << a[i];

    return 0;
}

测试结果

输入10000,210000的结果如下:
在这里插入图片描述

举报

相关推荐

0 条评论