大数计算器(加减乘除)

news2024/11/21 0:16:01
#define _CRT_SECURE_NO_DEPRECATE 1

#include<stdio.h>
#include<string.h>
#define N 200
#define jc_MAX 4000

//输入
void input_digit(char s1[], char s2[])
{
    printf("请输入第一个数:");
    scanf("%s", s1);
    printf("请输入第二个数:");
    scanf("%s", s2);

}
//逆置
void resave(char s1[], char s2[], int a[], int b[], int len_a, int len_b)
{
    int i = 0;

    for ( i = len_a - 1; i >= 0; i--)
    {
        a[i] = s1[len_a - i - 1] - '0';
    }

    for ( i = len_b - 1; i >= 0; i--)
    {
        b[i] = s2[len_b - i - 1] - '0';
    }

}

int max_len(int len_a, int len_b)
{
    return (len_a >= len_b) ? len_a : len_b;
}

//加法
void add(int len_a, int len_b, int c[], int a[], int b[])
{
    int i = 0;
    for ( i = 0; i < max_len(len_a, len_b); i++)
    {

        c[i] += a[i] + b[i];
        c[i + 1] = c[i] / 10;
        c[i] %= 10;
    }

    printf("和是:");
    for ( i = max_len(len_a, len_b); i >= 0; i--)
    {
        if (i == max_len(len_a, len_b) && c[i] == 0)
            continue;
        printf("%d", c[i]);
    }
}
//计算加法过程
void calc_add(char s1[], char s2[], int c[], int a[], int b[])
{
    input_digit(s1, s2);
    int len_a = strlen(s1);
    int len_b = strlen(s2);


    resave(s1, s2, a, b, len_a, len_b);
    add(len_a, len_b, c, a, b);
}


//减法
//比较长度相等时的大小
int compare(const int a[], const int b[], int len_a)
{
    do
    {
        if (a[len_a - 1] > b[len_a - 1])
        {
            return 1;
        }
        else if (a[len_a - 1] < b[len_a - 1])
        {
            return 0;
        }
        else
        {
            len_a--;
        }
    } while (len_a != 0);
    return -1;

}
//比较长度不等时的大小
int heavy_one(int a[], int len_a, int b[], int len_b)
{
    if (len_a > len_b)
    {
        return 1;
    }
    else if (len_a < len_b)
    {
        return 0;
    }
    else
    {
        return compare(a, b, len_a);
    }

}
void sub(int len_a, int len_b, int c[], int a[], int b[])
{
    int i;
    if (heavy_one(a, len_a, b, len_b) == 1)
    {
        for ( i = 0; i < max_len(len_a, len_b); i++)
        {
            if (a[i] < b[i])
            {
                a[i] += 10;
                a[i + 1] -= 1;
            }
            c[i] = a[i] - b[i];
        }
        printf("差是:");
    }
    else
    {
        for ( i = 0; i < max_len(len_a, len_b); i++)
        {
            if (b[i] < a[i])
            {
                b[i] += 10;
                b[i + 1] -= 1;
            }
            c[i] = b[i] - a[i];
        }
        printf("差是:-");
    }

    for ( i = max_len(len_a, len_b); i >= 0; i--)
    {
        if (i == max_len(len_a, len_b) && c[i] == 0)
            continue;
        printf("%d", c[i]);
    }//倒着输出
}
void calc_sub(char s1[], char s2[], int c[], int a[], int b[])
{
    input_digit(s1, s2);

    int len_a = strlen(s1);
    int len_b = strlen(s2);

    resave(s1, s2, a, b, len_a, len_b);

    sub(len_a, len_b, c, a, b);
}


//乘法
void mul(int len_a, int len_b, int c[], int a[], int b[])
{
    int i, j;
    int len_c = len_a + len_b;

    for ( i = 0; i < len_a; i++)
    {
        for ( j = 0; j < len_b; j++)
        {
            c[i + j] += a[i] * b[j];
            c[i + j + 1] += c[i + j] / 10;
            c[i + j] %= 10;
        }
    }
    while (c[len_c - 1] == 0 && len_c > 1)
    {
        len_c--;
    }
    printf("两数之积是:");
    for ( i = len_c - 1; i >= 0; i--)
    {
        printf("%d", c[i]);
    }
}
void calc_mul(char s1[], char s2[], int c[], int a[], int b[])
{
    input_digit(s1, s2);

    int len_a = strlen(s1);
    int len_b = strlen(s2);

    resave(s1, s2, a, b, len_a, len_b);

    mul(len_a, len_b, c, a, b);
}


//阶乘
void Print_Factorial(int n)
{
    int a[jc_MAX];
    int temp, num, digit;           //temp:每一位的结果  num:进位   digit:结果的位数
    int i, j;
    a[0] = 1;
    digit = 1;                      //从第1位开始 
    if (n >= 0)
    {
        for ( i = 2; i <= n; i++)
        {
            num = 0;
            for ( j = 0; j < digit; j++)
            {
                temp = a[j] * i + num;
                num = temp / 10;
                a[j] = temp % 10;
            }
            while (num)
            {
                a[digit] = num % 10;
                num /= 10;
                digit++;
            }
        }

        printf("%d的阶乘是:", n);
        for (i = digit - 1; i >= 0; i--)
        {
            printf("%d", a[i]);
        }
    }
    else printf("Invalid input");
}

//除法
int compare_Div(int a[], int b[]) {
    //索引为0的数据为数组长度
    if (a[0] > b[0]) {
        return 1;
    }
    else if (a[0] < b[0]) {
        return -1;
    }
    int i = 0;
    //逐位比较
    for ( i = a[0]; i > 0; i--)
    {
        if (a[i] > b[i])
        {
            return 1;
        }
        else if (a[i] < b[i]) {
            return -1;
        }
    }

    return 0;
}
void numcpy(int a[], int b[], int dest) {
    //将数组右移,使两个数组右端对齐
    int i = 1;
    for ( i = 1; i <= a[0]; i++)
    {
        b[i + dest - 1] = a[i];
    }
    b[0] = a[0] + dest - 1;
}
void Div_re(int a[], int b[], char s1[], char s2[], int len_a, int len_b)
{
    int i = 0;
    for ( i = 0; i < len_a; i++) 
    {
        a[len_a - i] = s1[i] - '0';
    }
    
    for ( i = 0; i < len_b; i++) 
    {
        b[len_b - i] = s2[i] - '0';
    }
}
void Div_su(int a[], int b[], int c[], char s1[], int tmp[])
{
    int j = 1;
    if (0 == compare_Div(a, b))
    {
        //两数相等
        printf("1\n0\n");

    }
    else if (-1 == compare_Div(a, b))
    {
      
        printf("商是:0\n");
        printf("余数是:%s\n", s1);

    }
    else {
        c[0] = a[0] - b[0] + 1;
        for (int i = c[0]; i > 0; i--) {
            memset(tmp, 0, sizeof(tmp));
            //高位对齐
            numcpy(b, tmp, i);

            //
            while (compare_Div(a, tmp) >= 0)
            {
                c[i]++;
                //减法
                for ( j = 1; j <= a[0]; j++)
                {
                    if (a[j] < tmp[j])
                    {
                        a[j + 1]--;
                        a[j] += 10;
                    }
                    a[j] -= tmp[j];
                }

                int k = a[0];
                while (a[k] == 0)
                {
                    k--;
                }
                a[0] = k;
            }
        }

        //控制最高位的0
        while (c[0] > 0 && c[c[0]] == 0)
        {
            c[0]--;
        }
    }

    //逆序打印输出商和余数
    printf("商是:");
    for (int i = c[0]; i > 0; i--)
    {
        printf("%d", c[i]);
    }
    printf("\n余数是:");
    if (0 == a[0])
    {
        printf("0\n");
    }
    else
    {
        for (int i = a[0]; i > 0; i--)
        {
            printf("%d", a[i]);
        }
        printf("\n");
    }
}
void calc_Div(char s1[], char s2[], int tmp[], int a[], int b[], int c[])
{
    int len_a = strlen(s1);
    int len_b = strlen(s2);
    a[0] = len_a;
    b[0] = len_b;

    Div_re(a, b, s1, s2, len_a, len_b);

    Div_su(a, b, c, s1, tmp);
}


//测试
void stratAdd()
{
    char s1[N], s2[N];
    int a[N] = { 0 }, b[N] = { 0 }, c[N] = { 0 };

    calc_add(s1, s2, a, b, c);
}
void stratSub()
{
    char s1[N], s2[N];
    int a[N] = { 0 }, b[N] = { 0 }, c[N] = { 0 };

    calc_sub(s1, s2, a, b, c);
}
void stratMul()
{
    char s1[N], s2[N];
    int a[N] = { 0 }, b[N] = { 0 }, c[N] = { 0 };

    calc_mul(s1, s2, a, b, c);
}
void stratDiv()
{
    char s1[N] = { 0 };//存储字符串
    char s2[N] = { 0 };//存储字符串
    int tmp[N] = { 0 };//交换用字符串
    int a[N] = { 0 };//存储加数A
    int b[N] = { 0 };//存储加数B
    int c[N] = { 0 };
    input_digit(s1, s2);

    calc_Div(s1, s2, tmp, a, b, c);
}
void Factorial()
{
    int n;
    printf("请输入:");
    scanf("%d", &n);
    Print_Factorial(n);
}

int display()
{
    int n;
    printf("\n------------------------------------------------\n");
    printf("------------------------------------------------");
    printf("\n输入1=>加法器\t输入2=>减法\n输入3=>乘法\t输入4=>除法\n\t输入5=>阶乘\n\t输入0=>退出程序\n");
    printf("------------------------------------------------");
    printf("\n------------------------------------------------\n");
    scanf("%d", &n);

    return n;
}
void again();

void menu()//定义菜单函数界面
{
    int result;
    result = display();

    switch (result)
    {
    case 1:
        printf("\n高精度加法器:\n");
        stratAdd();
        again();
        break;
    case 2:
        printf("\n高精度减法器:\n");
        stratSub();
        again();
        break;
    case 3:
        printf("\n高精度乘法器:\n");
        stratMul();
        again();
        break;
    case 4:
        printf("\n高精度除法器:\n");
        stratDiv();
        again();
        break;
    case 5:
        printf("\n高精度求阶乘:\n");
        Factorial();
        again();
        break;
    case 0:
        printf("退出程序。");
        break;
    default:
        printf("输入格式错误");
        again();
        break;
    }
}
void again()
{
    int choice = 0;
    printf("\n\n输入“1”继续进行计算;输入任意值退出程序\n请选择:");
    scanf("%d", &choice);
    if (choice == 1)
    {
        menu();
    }
    else
    {
        printf("退出程序。");
    }

}

int main()
{
    menu();

    return 0;
}

高精度加法与高精度减法同理

就是我们小学的列竖式计算(注意逆置):

         

同理,高精度乘法:

高精度除以高精度,通过高精度减法的次数来得出商

阶乘:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1821236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

郑州申请大气污染防治乙级资质,这些材料必不可少

在郑州申请大气污染防治乙级资质时&#xff0c;以下材料是必不可少的&#xff1a; 一、企业基础资料&#xff1a; 企业法人营业执照副本&#xff1a;需清晰&#xff0c;且在有效期内[1][2]。企业章程&#xff1a;提交企业章程的扫描件或复印件&#xff0c;以展示企业的组织结构…

基于机器学习和深度学习的轴承故障诊断方法(Python)

在工业早期&#xff0c;设备故障诊断通常由专家通过观察设备运行中的变量参数并结合自身知识进行诊断。但相比传统的机理分析方法&#xff0c;数据驱动的智能设备故障诊断更能充分提取数据中隐含的故障征兆、因果逻辑等关系。智能设备故障诊断的优势表现在其对海量、多源、高维…

【Python】已完美解决:ERROR: Could not find a version that satisfies the requirement re

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例&#xff08;结合实战场景&#xff09;五、注意事项 已解决&#xff1a;“ERROR: Could not find a version that satisfies the requirement re”的问题 一、问题背景 在使用Python的pip包管理器安…

codegeex2-6b-int4 部署

codegeex2-6b-int4 模型文件 CodeGeeX2 仓库文件地址 CodeGeeX2 推理教程 conda create -n codegeex2 python3.10 -y conda activate codegeex2 pip install -r requirements.txt -i https://pypi.mirrors.u…

2024中国翻译行业发展报告

来源&#xff1a;中国翻译协会 近期历史回顾&#xff1a; 2024国内工商业储能市场研究报告.pdf 2023幸福企业白皮书.pdf 2024年欧亚地区移动经济报告.pdf 内容供应链变革 2023人工智能与首席营销官&#xff08;CMO&#xff09; AI科技对PC产业的影响.pdf 金融业数据应用发展报…

成都晨持绪:抖音电商新手怎么做可信

在如今这个信息爆炸的时代&#xff0c;抖音作为新兴的电商平台&#xff0c;为许多创业者和商家提供了展示和销售产品的新渠道。然而&#xff0c;对于刚入行的新手来说&#xff0c;如何在抖音上建立起一个可信的电商身份&#xff0c;却是一个值得深思的问题。 要确保所售卖的产品…

短剧分销市场动态:机遇挑战双重解读

一、引言 近年来&#xff0c;随着互联网的快速发展和智能手机的普及&#xff0c;短视频和短剧逐渐成为人们日常娱乐的重要组成部分。短剧以其短小精悍、情节紧凑的特点&#xff0c;吸引了大量观众的关注和喜爱。而短剧分销市场则应运而生&#xff0c;为内容创作者和平台方提供了…

[数据集][目标检测]减速带检测数据集VOC+YOLO格式5400张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5400 标注数量(xml文件个数)&#xff1a;5400 标注数量(txt文件个数)&#xff1a;5400 标注…

Linux 中 “ 磁盘、进程和内存 ” 的管理

在linux虚拟机中也有磁盘、进程、内存的存在。第一步了解一下磁盘 一、磁盘管理 &#xff08;1.1&#xff09;磁盘了解 track&#xff08; 磁道 &#xff09; &#xff1a;就是磁盘上的同心圆&#xff0c;从外向里&#xff0c;依次排序1号&#xff0c;2号磁盘........等等。…

ZnO电阻片在低电场区域的泄漏电流及其电阻的负温度系数

在低电场区域,流过ZnO非线性电阻的泄漏电流小于1mA.泄漏电流不仅与施加的电压幅值有关,而且与温度高低有关。图2.6表示温度对泄漏电流的影响,温度越高,电子在电场作用下定向的运动就越激烈,导致泄漏电流增大。因此温度升高将导致电阳值下降,即ZnO 电阻呈现负温度特性。 一般以…

Siemens-NXUG二次开发-创建平面(无界非关联)、固定基准面[Python UF][20240614]

Siemens-NXUG二次开发-创建平面&#xff08;无界非关联&#xff09;、固定基准面[Python UF][20240614] 1.python uf函数1.1 NXOpen.UF.Modeling.CreatePlane1.2 NXOpen.UF.ModlFeatures.CreateFixedDplane 2.示例代码2.1 pyuf_plane.py 3.运行结果3.1 内部模式3.1.1 NXOpen.UF…

期末复习5---PTA

以下是提交正确的代码&#xff1a; int max_len( char *s[], int n ) {int i;int max0;for(i1;i<n;i){if(strlen(s[i])>strlen(s[max]))maxi;}return strlen(s[max]); } 以下是我自己写的代码&#xff1a; 出现的问题是 &#xff1a;括号加的不对&#xff0c;需要细心…

湖仓一体全面开启实时化时代

摘要&#xff1a;本文整理自阿里云开源大数据平台负责人王峰&#xff08;莫问&#xff09;老师在5月16日 Streaming Lakehouse Meetup Online 上的分享&#xff0c;主要介绍在新一代湖仓架构上如何进行实时化大数据分析。内容主要分为以下五个部分&#xff1a; Data Lake Dat…

YOLOv8可视化界面,web网页端检测

YOLOv8可视化界面&#xff0c;web网页端检测。支持图片检测&#xff0c;视频检测&#xff0c;摄像头检测等&#xff0c;支持检测、分割等多种任务&#xff0c;实时显示检测画面。支持自定义数据集&#xff0c;计数&#xff0c;……

【教程】从0开始搭建大语言模型:构造GPT模型

从0开始搭建大语言模型&#xff1a;构造GPT模型 从0开始搭建大语言模型&#xff1a;构造GPT模型GPT模型Layer NormalizationGELU激活函数Feed Forward网络增强shortcut连接构造Transformer Block构造GPT模型使用GPT模型生成文本 从0开始搭建大语言模型&#xff1a;构造GPT模型 …

第104天: 权限提升-Linux 系统环境变量定时任务权限配置不当MDUT 自动化

目录 案例一&#xff1a;Linux-环境变量文件配合 SUID-本地 案例二&#xff1a;Linux-定时任务打包配合 SUID-本地 案例三&#xff1a;Linux-定时任务文件权限配置不当-WEB&本地 案例四&#xff1a;Linux-第三方软件 MYSQL 数据库提权-WEB&本地 隧道出网 手工提权…

将自己md文件发布到自己的博客园实现文件的持久化存储

上传markdown文件到博客园 目录 【0】需求原因【1】功能【2】环境【最佳实践测试】 &#xff08;1&#xff09;查看 Typora 设置&#xff08;2&#xff09;配置 pycnblog 配置文件 config.yaml&#xff08;3&#xff09;运行 pycnblog 中的文件 cnblog_markdown.cmd&#xff0…

基于文本和图片输入的3D数字人化身生成技术解析

随着虚拟现实、增强现实和元宇宙等技术的飞速发展,对高度逼真且具有表现力的3D数字人化身的需求日益增长。传统的3D数字人生成方法往往需要依赖大量的3D数据集,这不仅增加了数据收集和处理的成本,还限制了生成的多样性和灵活性。为了克服这些挑战,我们提出了一种基于文本提…

flask基础3-蓝图-cookie-钩函数-flask上下文-异常处理

目录 一&#xff1a;蓝图 1.蓝图介绍 2.使用步骤 3.蓝图中的静态资源和模板 二.cookie和session 1.cookie 2.flask中操作cookie 3.session 4.session操作步骤 三.请求钩子 四.flask上下文 1.介绍 2.请求上下文&#xff1a; 3.应用上下文 3.g对象 五&#xff1a;…

怕怕怕怕怕怕怕怕怕怕

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…