当前位置:网站首页>【c语言】高精度加减乘除模板
【c语言】高精度加减乘除模板
2022-07-15 13:39:00 【亦梦亦醒乐逍遥】
其实csdn有很多,但我不太习惯,今天下午调试很不爽,就自己写了一个,备用。
常规思路,倒序转化int,计算后再倒序转回char[]
还有最快的思路,bitset,直接用位操作(但是我不会)
void add(const char str1[], const char str2[], char ans[])
{
#define _MAX_WID 500
//使用指南:str1+str2=ans
//思路核心:先转化成int,实现进位,然后再变成char
//内置长度可以修改,如果爆内存就用全局
int a[_MAX_WID], b[_MAX_WID];//a,b用来临时储存int
int len1 = strlen(str1);
int len2 = strlen(str2);
int len = (len1 > len2 ? len1 : len2) + 1;//取长度为最大+1
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
//倒序录入,保证尾部对齐
//char转int,不需要补充\0
for (int i = len1 - 1; i >= 0; i--)
a[len1 - i - 1] = str1[i] - '0';
for (int i = len2 - 1; i >= 0; i--)
b[len2 - i - 1] = str2[i] - '0';
//运算并进位
for (int i = 0; i < len; i++)
{
a[i] = a[i] + b[i];
if (a[i] > 9)
{
a[i + 1] += 1;
a[i] -= 10;
}
}
//清除头部多余的0(因为倒序实际上是在a的结尾)
while (a[len - 1] == 0 && len > 1)
len--;
//倒序int还原char,补充\0
ans[len] = '\0';
for (int i = len - 1; i >= 0; i--)
ans[len - 1 - i] = a[i] + '0';
}bool minus(const char str1[], const char str2[], char ans[])
{
//使用指南:str1-str2=ans,如果是正的,就返回true
//思路核心:先转化成int,实现进位,然后再变成char
//内置长度可以修改,如果爆内存就用全局
#define _MAX_WID 100
int a[_MAX_WID], b[_MAX_WID];//a,b用来临时储存int
int len1 = strlen(str1);
int len2 = strlen(str2);
int len = len1 > len2 ? len1 : len2;
bool ispositive = 1;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
//比较大小,倒序录入,保证尾部对齐
//char转int,不需要补充\0。
if (len1 < len2 || ((len1 == len2 && strcmp(str1, str2) < 0)))//小减大:位数小或者同位数字典序小
{
ispositive = 0;
//前一个小,str2->a
for (int i = len2 - 1; i >= 0; i--)
a[len2 - 1 - i] = str2[i] - '0';
for (int i = len1 - 1; i >= 0; i--)
b[len1 - i - 1] = str1[i] - '0';
}
else
{
//前一个大,str1->a
for (int i = len1 - 1; i >= 0; i--)
a[len1 - i - 1] = str1[i] - '0';
for (int i = len2 - 1; i >= 0; i--)
b[len2 - i - 1] = str2[i] - '0';
}
//运算并进位
for (int i = 0; i < len; i++)
{
a[i] = a[i] - b[i];
if (a[i] < 0)
{
a[i + 1] -= 1;
a[i] += 10;
}
}
//清除头部多余的0(因为倒序实际上是在a的结尾)
while (a[len - 1] == 0 && len > 1)
len--;
//倒序int还原char,补充\0
ans[len] = '\0';
for (int i = len - 1; i >= 0; i--)
ans[len - 1 - i] = a[i] + '0';
return ispositive;
}
void multiple(const char str1[], const char str2[], char ans[])
{
//使用指南:str1*str2=ans|注意外面开的char[],ans是str宽度的两倍
//思路核心:先转化成int,实现进位,然后再变成char
//内置长度可以修改,如果爆内存就用全局.
#define WIDTH 100
int a[WIDTH], b[WIDTH], c[2 * WIDTH];
int len1 = strlen(str1);
int len2 = strlen(str2);
int len = len1 + len2;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
//char转int,倒序
for (int i = len1 - 1; i >= 0; i--)
a[len1 - 1 - i] = str1[i] - '0';
for (int i = len2 - 1; i >= 0; i--)
b[len2 - 1 - i] = str2[i] - '0';
//乘法运算:(虽然ij顺序没有什么区别,但是还是区分了一下)
//j是下面的数,代表权重,i是上面的数,每次都要对j遍历一次
for (int j = 0; j < len2; j++)
for (int i = 0; i < len1; i++)
c[i + j] += a[i] * b[j];
//进位,第len位(c[len-1])不用进了,这是位数上限
for (int i = 0; i < len - 1; i++)
{
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
//去头
while (c[len - 1] == 0 && len > 1)
len--;
//int转char,补充串尾
ans[len] = '\0';
for (int i = len - 1; i >= 0; i--)
ans[len - 1 - i] = c[i] + '0';
}int divide(char str[], int divisor, char ans[])
{
//大数除小数
//使用指南:str/divisor=ans 返回remain
//思路核心:先转化成int,实现进位,然后再变成char
//内置长度可以修改,如果爆内存就用全局.
#define WIDTH 100
int a[WIDTH], b[WIDTH];
int remain = 0;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
int len = strlen(str);
//char转int
for (int i = 0; i < len; i++)
a[i] = str[i] - '0';
//运算求余
for (int i = 0; i < len; i++)
{
b[i] = (remain * 10 + a[i]) / divisor;
remain = (remain * 10 + a[i]) % divisor;
}
//找到起始点,储存到ans,补充\0,
int start = 0;
while (b[start] == 0 && start < len - 1)
start++;
for (int i = start, j = 0; i < len; i++, j++)
ans[j] = b[i] + '0';
return remain;
}边栏推荐
猜你喜欢

Interprocess communication -- signal principle and detailed explanation

强化学习(Q-Learning)与路径搜索(A*)的联系

Processes in Oracle

Graphpad prism 9.3 software download and installation tutorial

从源码探究双亲委派机制

【OpenFOAM学前预备3——安装OpenFOAM-v8】

JVM垃圾收集之——怎样判定一个对象是不是垃圾

Openharmony hidden poem application

减淡背景的注册+登录表单页面

JS image editor plug-in filerobot
随机推荐
101. (cesium chapter) cesium particle system - snow
Processes in Oracle
JVM内存模型——运行时数据区的特点和作用
JS image editor plug-in filerobot
T40n intelligent video application processor battery camera SOC
scroll-view 固定高度 实现触底效果
gradle 打包排除依赖 排除文件
js图片裁剪及压缩整合插件
Judge whether it is PC or mobile terminal in router
leetcode 148. 排序链表
Ant desgin Open PDF to add Authentication Parameter Data
MIMX8MD6CVAHZAB I.MX 8MDUAL Cortex-A53 - 微处理器
好消息|该地考生的二建成绩能查询了
【走进go的内心深处】
What is the overall solution for Oracle to migrate to polardb for PostgreSQL?
vulnhub Funbox: Easy (funbox3)
Flock's yarn clustering mode (1)
Scroll view fixed height to achieve bottom touch effect
Gradle packaging exclusion dependency exclusion file
在 Polkadot 中进行创建的三种方式 —— 平行链、平行线程、智能合约