/////////
思路:用字符串模拟
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
string s1, s2;
cin >> s1 >> s2;
if (s1 == "0" || s2 == "0") {
cout << "0" << endl;
return 0;
}
int len1 = s1.size();
int len2 = s2.size();
vector<int> result(len1 + len2, 0);
for (int i = len1 - 1; i >= 0; i--) {
int num1 = s1[i] - '0';
for (int j = len2 - 1; j >= 0; j--) {
int num2 = s2[j] - '0';
int product = num1 * num2;
int sum = product + result[i + j + 1];
result[i + j + 1] = sum % 10;
result[i + j] += sum / 10;
}
}
int start = 0;
while (start < result.size() && result[start] == 0) {
start++;
}
for (int i = start; i < result.size(); i++) {
cout << result[i];
}
cout << endl;
return 0;
}
思路:高精度乘法和加法,这里也可以用数组存储优化
#include <iostream>
#include <vector>
using namespace std;
void multiply(vector<int>& a, int b) {
int carry = 0;
for (int i = 0; i < a.size(); ++i) {
int product = a[i] * b + carry;
a[i] = product % 10;
carry = product / 10;
}
while (carry > 0) {
a.push_back(carry % 10);
carry /= 10;
}
}
void add(vector<int>& sum, const vector<int>& a) {
int carry = 0;
int max_len = max(sum.size(), a.size());
for (int i = 0; i < max_len; ++i) {
int digit_sum = carry;
if (i < sum.size()) digit_sum += sum[i];
if (i < a.size()) digit_sum += a[i];
if (i < sum.size()) {
sum[i] = digit_sum % 10;
} else {
sum.push_back(digit_sum % 10);
}
carry = digit_sum / 10;
}
if (carry > 0) {
sum.push_back(carry);
}
}
int main() {
int n;
cin >> n;
vector<int> sum = {0};
vector<int> factorial = {1};
for (int k = 1; k <= n; ++k) {
multiply(factorial, k);
add(sum, factorial);
}
for (int i = sum.size() - 1; i >= 0; --i) {
cout << sum[i];
}
cout << endl;
return 0;
}
ER表(实体关系表)深度解析
一、ER表的核心要素扩展
1. 实体类型的高级表示
-
弱实体:用双边框表示,依赖其他实体存在(如订单项依赖订单)
-
复合实体:用于多对多关系的桥接表(如学生选课表)
-
派生属性:可通过计算得到的属性(如年龄可从生日派生)
2. 关系的深度分类
-
识别关系:弱实体与强实体的关系(虚线表示)
-
非识别关系:常规实体间关系(实线表示)
-
递归关系:同一实体内部的关系(如员工管理员工)
3. 属性的详细类型
-
简单属性:不可再分的原子属性(如学号)
-
复合属性:可分解为更小部分的属性(如地址可分解为省市区)
-
多值属性:一个实例可有多个值(如一个人的多个电话号码)
-
键属性:唯一标识实体的属性(下划线标注)
二、ER表设计进阶技巧
1. 规范化设计
-
第一范式(1NF):消除重复组,确保原子性
-
第二范式(2NF):消除部分函数依赖
-
第三范式(3NF):消除传递函数依赖
-
BCNF:更严格的3NF变体
2. 关系基数表示法
复制
1:1 一对一(如员工-社保号) 1:N 一对多(如部门-员工) N:M 多对多(如学生-课程)
3. 特殊关系处理
-
三元关系:三个实体间的关系(如医生-患者-药品)
-
超类型/子类型:继承关系(如人员→员工/学生)
-
角色指示:同一实体在不同关系中的角色(如员工同时是项目成员和项目经理)
三、ER表到物理模型的转换
1. 转换规则
-
强实体→独立表
-
弱实体→依赖表(包含强实体主键)
-
1:1关系→合并表或外键
-
1:N关系→外键放在多方
-
N:M关系→新建关联表
2. 性能优化考虑
-
反规范化:有意识引入冗余提高查询效率
-
索引策略:对频繁查询字段建立索引
-
分区设计:大数据量表的分区存储
四、ER表工具支持
1. 常用建模工具
-
专业工具:ERwin, PowerDesigner, IBM Data Architect
-
开源工具:MySQL Workbench, DBeaver, Dia
-
在线工具:Lucidchart, Draw.io, dbdiagram.io
2. 版本控制集成
-
使用Git管理ER模型变更
-
差异比较工具进行版本比对
-
自动化文档生成
五、ER表实际应用案例
1. 电商系统ER表示例
复制
[用户表]---1:N---[订单表] | | | N:M [收货地址] [订单商品表]---N:1---[商品表]
2. 医院管理系统ER表示例
复制
[医生表]---N:M---[患者表]---1:N---[病历表] | | N:M 1:N [科室表] [处方表]---N:1---[药品表]
六、常见设计陷阱与解决方案
-
过度使用多值属性→转换为关联表
-
忽略历史数据需求→添加时间戳字段
-
循环引用问题→引入中间实体打破循环
-
命名不一致→建立统一的命名规范
七、ER表与新型数据库
-
关系型数据库:严格遵循ER模型
-
NoSQL数据库:
-
文档数据库:嵌入式文档代替关系
-
图数据库:直接表示实体和关系
-
键值存储:简化模型
-