平平无奇的平平无奇-c++

c++八股文

1.c++大整数乘法模拟(也称高精度计算)

问题: 设计一个类,模拟大整数乘法(比如两个超过64位的数据相乘)给出乘法函数细节

解答: 下面的图  从结果上看是正确的

原因是: 首先算3*7肯定没什么疑问,接下来正常应该2*7,但我们假设按照右边的逻辑顺序算3*8,我们肯定知道3*8应该错一位, 3*9应该错两位(此时错位应该是在i的基础上偏移j位),算2*7(应该错1位,因为2是第一个数的【1】位),算2*8应该错两位(此时不但算上i的错位还要算j的偏移量),到这里就能发现错位应该是【i+j】 于是 result[i + j] += digits[i] * other.digits[j]; 应该就不难理解了,但为什么和正常的计算顺序不同?可以发现只要  保证对应两个数相乘后  被  放在了正确的位置  上,那么  先算哪两个数相乘  是没有影响的,最后反正都会加起来。

#include <iostream>
#include <vector>
using namespace std;
class BigInteger {
private:
    std::vector<int> digits;

public:
    BigInteger() {
        digits.push_back(0);
    }

    BigInteger(const std::string& numStr) { //数组倒序初始化
        for (int i = numStr.size() - 1; i >= 0; i--) {
            digits.push_back(numStr[i] - '0');
        }
    }
    void print(std::vector<int> &tt) const {
        for(auto i = tt.begin(); i != tt.end();i++){
            cout<< (*i) << "   ";
        }
        cout<<  endl;
    }


    BigInteger operator*(const BigInteger& other) const {
        int len1 = digits.size();
        int len2 = other.digits.size();
        std::vector<int> result(len1 + len2, 0);

        for (int i = 0; i < len1; i++) {
            for (int j = 0; j < len2; j++) {
                result[i + j] += digits[i] * other.digits[j]; //理解这里非常重要
                result[i + j + 1] += result[i + j] / 10;
                result[i + j] %= 10;
                //print(result);
            }
        }

        while (result.size() > 1 && result.back() == 0) {
            result.pop_back(); //最高位如果乘起来没超过10 会多一个0 比如123 * 1  但是申请了len(123)+len(123)+1=4 的空间 把最末尾的0去掉
        }

        return BigInteger(result);
    }

    BigInteger(const std::vector<int>& numVec) : digits(numVec) {}

    friend std::ostream& operator<<(std::ostream& os, const BigInteger& num) {
        for (int i = num.digits.size() - 1; i >= 0; i--) {  //将数组中 倒叙输出 即为答案
            os << num.digits[i];
        }
        return os;
    }
};

int main() {
    BigInteger num1("123456789123456789");
    BigInteger num2("987654321987654321");
    
    BigInteger product = num1 * num2;
    std::cout << "Product: " << product << std::endl;

    return 0;
}

2.c++ 中智能指针

有哪三种? 各自的特征是什么?

WeakPtr<T>如何解决循环引用的问题?

3.C++ 多态 继承 重载 虚函数

如何理解"静态多态"和"动态多态"?  多态是如何实现的?(查虚函数表,虚函数的实现原理)

https://blog.csdn.net/m0_38086244/article/details/133902077C++ 支持多态、继承和函数重载,这些是面向对象编程(OOP)的基本概念。方法,它会根据实际对象的类型来选择正确的函数实现。这是多态的一个示例,同时还涵盖了继承和虚函数。函数中,使用多态性来调用不同类型的对象的。是派生类,它们都重写了。https://blog.csdn.net/m0_38086244/article/details/133902077

4.给一个入栈顺序,考虑出栈顺序有几种?

怎么理解出栈顺序有多少种?(递推式的构造) - 知乎1.先把问题讲清楚给定 n 个数,一个空栈 S ,每次栈指向入栈或出栈操作,他们的出栈顺序有多少种?方便起见,我们把待进入的元素记为 [a_1,a_2,...,a_{n-1},a_n] ,入栈顺序为 1,2,3,4,...,n 当 n=3 时,可能的出…icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/391237550

5.sizeof() 到底占几个字节? struct 字节数怎么计算? 如何可以不对齐?

sizeof()运算:

https://blog.csdn.net/qq_19887221/article/details/125292373C/C++ sizeof() 详解(基本数据类型、指针、数组、字符串、函数、结构体、类、联合体)_c++ sizeofhttps://blog.csdn.net/qq_19887221/article/details/125292373结构体对齐:

结构体的字节对齐(超详细:规则+例子+原因)-CSDN博客文章目录结构体的字节对齐问题遵循的规则:典型例子:需要内存对齐的原因:结构体的字节对齐问题遵循的规则:某数据类型的变量存放的地址需要按有效对齐字节剩下的字节数可以被该数据类型所占字节数整除,char可以放在任意位置,int存放在剩下字节数可以被4整除的位置。这个对齐规则是内部一定的结构体的大小一定要为有效对齐值的整数倍当没有明确指明时,以结构体中最长的成员的长度来对齐,注意!数组成员个数并不影响有效对齐值,只是数组类型大小和其他成员比较取最大。但是当然数组成员总占用内存也要遵循字节对齐_字节对齐https://blog.csdn.net/weixin_42155498/article/details/108033340

如何让struct不字节对齐_struct设置不对齐-CSDN博客下面我们使用预编译指令#progma pack (value)来告诉编译器,使用我们指定的对齐值来取代缺省的。#progma pack (2) /*指定按2字节对齐*/struct C{char b;int a;short c;};#pro_struct设置不对齐https://blog.csdn.net/wuchuanpingstone/article/details/6880571

#pragma pack(n)和 __attribute__((__n__))? 到底有什么作用
 

嵌套结构体的情况icon-default.png?t=N7T8https://blog.csdn.net/qq_44443986/article/details/110082316#:~:text=%E8%AE%A1%E7%AE%97%E6%B5%81%E7%A8%8B,%EF%BC%9A%E8%B5%B7%E5%A7%8B%E5%9C%B0%E5%9D%80%E4%BD%8D%E7%BD%AE%E4%B8%BA0%EF%BC%8Cshort%E7%B1%BB%E5%9E%8B%E5%8D%A0%E4%BA%862%E4%B8%AA%E5%AD%97%E8%8A%82%EF%BC%8C%E4%B8%8B%E9%9D%A2%E7%9A%84%E4%B8%80%E4%B8%AA%E6%88%90%E5%91%98%E7%B1%BB%E5%9E%8B%E4%B8%BA%E7%BB%93%E6%9E%84%E4%BD%93%EF%BC%8C%E6%AD%A4%E6%97%B6%E8%A6%81%E4%B8%8E%E5%B5%8C%E5%A5%97%E7%9A%84%E7%BB%93%E6%9E%84%E4%BD%93%E9%87%8C%E6%9C%80%E5%A4%A7%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%B1%BB%E5%9E%8B%EF%BC%8C%E4%B9%9F%E5%B0%B1%E6%98%AF%E5%92%8Cdouble%208%E5%AD%97%E8%8A%82%E5%AF%B9%E9%BD%90%EF%BC%8C%E6%89%80%E4%BB%A5%E5%8F%A6%E5%BC%80%E8%BE%9F%E7%A9%BA%E9%97%B46%E4%B8%AA%EF%BC%8C%E6%AD%A4%E6%97%B6%E5%9C%B0%E5%9D%808%E6%98%AF8%E7%9A%84%E5%80%8D%E6%95%B0%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%AD%98%E6%94%BE%E7%BB%93%E6%9E%84%E4%BD%93%EF%BC%8C%E8%BF%99%E9%87%8C%E8%AE%A1%E7%AE%97%E9%87%8C%E9%9D%A2%E7%9A%84%E7%BB%93%E6%9E%84%E4%BD%93%E7%9A%84%E5%A4%A7%E5%B0%8F%E4%B8%BA24%EF%BC%8C%E6%89%80%E4%BB%A58%2B24%3D32%EF%BC%8C%E6%89%80%E4%BB%A5%E6%AD%A4%E6%97%B6%E4%B8%80%E5%85%B1%E5%8D%A0%E4%BA%8632%E4%B8%AA%E5%AD%97%E8%8A%82%E7%A9%BA%E9%97%B4%E7%9A%84%E5%A4%A7%E5%B0%8F%EF%BC%8C%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AAint%E7%B1%BB%E5%9E%8B%EF%BC%8C32%E6%98%AF4%E7%9A%84%E6%95%B4%E6%95%B0%E5%80%8D%EF%BC%8C%E6%89%80%E4%BB%A5int%E5%B0%B1%E7%9B%B4%E6%8E%A5%E5%AD%98%E5%9C%A8%E7%BB%93%E6%9E%84%E4%BD%93%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%90%8E%E9%9D%A2%EF%BC%8C32%2B4%3D36%EF%BC%8C%E6%9C%80%E5%90%8E%E8%A6%81%E5%92%8C%E7%BB%93%E6%9E%84%E4%BD%93%E6%9C%80%E5%A4%A7%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E8%A1%A5%E9%BD%90%EF%BC%8C%E9%87%8C%E9%9D%A2%E7%9A%84%E7%BB%93%E6%9E%84%E4%BD%93%E7%9A%84%E7%B1%BB%E5%9E%8B%E4%B9%9F%E7%AE%97%E3%80%82

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值