2 条题解
-
0
某管理说我ctj了
那我就展示下我ctj的代码
// 高精度模板代码,注意代码中都没有考虑负数情况,题目中出现了负数则需要加一些判断和处理(自己之前写的) #include <cstdio> #include <cstring> #include<iostream> using namespace std; // 高精度实现中,一般令数组的最大长度LEN比输入和结果大一些,这样可以省去不少边界情况的处理 const int LEN = 5100; int a[LEN], b[LEN], c[LEN]; char s[LEN]; // read()读取一个大整数并反转存放在num数组中,返回读入的整数长度 int read(int num[]) { memset(num, 0, sizeof(int) * LEN); scanf("%s", s); int len = strlen(s); for (int i = 0; i < len; i++) { num[i] = s[len-1-i] - '0'; } return len; } // print()输出大整数num void print(int num[]) { int i; // 这里i>=1而不是1>=0是因为当整个数字等于0时仍希望输出一个字符0 for (i = LEN - 1; i >= 1; i--) { if (num[i] != 0) break; } for (; i >= 0; i--) putchar(num[i] + '0'); } // geq()判断num1是否大于等于num2。la、lb分别为num1、num2的长度 bool geq(int la, int lb, int num1[], int num2[]) { if (la != lb) return la > lb; for (int i = la - 1; i >= 0; i--) { if (num1[i] > num2[i]) return true; else if (num1[i] < num2[i]) return false; } return true; } // add()计算num1+num2,将结果存在res数组中 void add(int num1[], int num2[], int res[]) { memset(res, 0, sizeof(int) * LEN); for (int i = 0; i < LEN - 1; i++) { res[i] += num1[i] + num2[i]; if (res[i] >= 10) { // 进位 res[i+1]++; res[i] -= 10; } } } // sub()计算num1-num2,将结果存在res数组中 void sub(int num1[], int num2[], int res[]) { memset(res, 0, sizeof(int) * LEN); for (int i = 0; i < LEN - 1; i++) { res[i] += num1[i] - num2[i]; if (res[i] < 0) { // 借位 res[i+1]--; res[i] += 10; } } } // mul()计算num1*num2,将结果存在res数组中 void mul(int num1[], int num2[], int res[]) { memset(res, 0, sizeof(int) * LEN); for (int i = 0; i < LEN - 1; i++) { // 这里直接计算结果中的从低到高第 i 位,且一并处理了进位 // 第 i 次循环为 res[i] 加上了所有满足 p + q = i 的 num1[p] 与 num2[q] 的乘积之和 for (int j = 0; j <= i; j++) { res[i] += num1[j] * num2[i-j]; } if (res[i] >= 10) { res[i+1] += res[i] / 10; res[i] %= 10; } } } // div()计算num1/num2的商,存在res数组中,并返回余数,注意这里num2是单精度整数,不是高精度 int div(int num1[], int num2, int res[]) { memset(res, 0, sizeof(int) * LEN); for (int i = LEN - 1; i >= 0; i--) { res[i] = num1[i] / num2; // 注意此处num2即使在int范围内,*10之后可能超过int范围,此时num1数组需要使用long long类型 if (i > 0) num1[i-1] += num1[i] % num2 * 10; } return num1[0] % num2; } long long x,y; int main() { char s; read(a); cin>>s; read(b); if(s=='+'){ add(a,b,c); } if(s=='*'){ mul(a,b,c); } if(s=='-'){ sub(a,b,c); } print(c); }
信息
- ID
- 3
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 40
- 已通过
- 13
- 上传者