大数加减1——将两个数均前后倒置,以对齐最低位

#include <stdio.h>

//将读入的数据存储到num[1]~num[x]中,num[0]表示存入数据的长度。
void read(int num[])
{
    int i;
    char ch;
    for (i = 0; i<500; i++)
        num[i] = 0;
    i = 1;
    while ((ch = getchar()) != ‘\n‘)
    {
        num[i] = ch - ‘0‘;
        i++;
        num[0]++;
    }
}

//将数据num[]中的数翻转,以便计算
void rev(int num[])
{
    int i, t;
    for (i = 1; i <= num[0] / 2;i++)
    {
        t = num[i];
        num[i] = num[num[0] + 1 - i];
        num[num[0] + 1 - i] = t;
    }
}

void print(int num[])
{
    char character[11] = { "0123456789-" };//character[n]表示数字n的字符形式。character[10]=‘-‘用于输出减法结果中的负号。
    int i;
    for (i = 1; i <= num[0]; i++)
        printf("%c", character[num[i]]);
    printf("\n");
}

//将a[]和b[]的值相加,存储于sum[]中。
void add(int sum[], int a[], int b[])
{
    //flag为进位标志位。
    int i, flag = 0;
    rev(a);
    rev(b);
    for (i = 1; i <= a[0] || i <= b[0]; i++)
        sum[i] = a[i] + b[i];

    if (a[0] > b[0])
        sum[0] = a[0];
    else
        sum[0] = b[0];

    for (i = 1; i <= sum[0]; i++)
    {
        sum[i] += flag;
        if (sum[i] > 9)
        {
            sum[i] = sum[i] % 10;
            flag = 1;
        }
        else
            flag = 0;
    }
    if (1 == flag)
    {
        sum[0] += 1;
        sum[i] = 1;
    }
    rev(sum);
    rev(a);//加法运算完之后,再将a,b翻转回来。
    rev(b);
}

void sub(int rst[], int a[], int b[])
{
    int i;
    int flag = 0;//flag为借位标志位。
    rev(a);
    rev(b);

    for (i = 1; i <= a[0] || i <= b[0]; i++)
        rst[i] = a[i] - b[i];

    if (a[0] > b[0])
        rst[0] = a[0];
    else
        rst[0] = b[0];

    for (i = 1; i <= rst[0]; i++)
    {
        rst[i] += flag;
        if (rst[i] < 0)
        {
            flag = -1;
            rst[i] += 10;
        }
        else
            flag = 0;
    }
    if (-1 == flag)
    {
        //此时,flag=-1表示a-b<0,故转换为求b-a。需要先将a,b翻转为原始数据
        rev(a);
        rev(b);
        sub(rst,b,a);
        //进行sub运算后,a,b,rst均为正常形式,需要将其翻转后,再添加负号。
        rev(rst);
        rev(a);
        rev(b);

        //在结果的最高位增加字符‘-’
        rst[0]++;
        rst[rst[0]] = 10;//如果某位为10,则输出时该位为“-”;
    }
    rev(rst);
    rev(a);
    rev(b);
}

int main()
{
    int a[500], b[500], he[500], cha[500];
    printf("Input a:");
    read(a);
    printf("Input b:");
    read(b);

    add(he, a, b);
    sub(cha, a, b);
    print(he);
    print(cha);
    return 0;
}

大数加减1——将两个数均前后倒置,以对齐最低位

时间: 2024-10-09 02:09:40

大数加减1——将两个数均前后倒置,以对齐最低位的相关文章

常见的编程问题(一)少大数加减

存储区的概念 常见的存储区域可分为: 栈 由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等. 堆 由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,程序会一直占用内存,导致内存泄漏,在程序结束后,操作系统会自动回收. 由malloc等分配的内存块,它和堆是十分相似的,不过它是用free来释放分配的内存. 全局/静态存储区 全局变量和静态变量被分配到同一块内存中,在

大数加减乘模板

大数加法: 1 #include <stdio.h> 2 3 #include <string.h> 4 5 #define M 100 //定义了数量M是100作为数组初始化的数量 6 7 8 9 int main() 10 11 { 12 13 int i, j, len_s1, len_s2; // len_s1是字符数组s1的长度, len_s2是字符数组s2的长度, 14 15 char s1[M], s2[M]; 16 17 int num1[M] = {0}; //

POJ 2756 Autumn is a Genius 使用string的大数加减

本题就是说一个小神童,能计算加减法. 不过题目知识说这个小神童,到底有多神,要我们自己发现. 因为最后给出的数据非常非常巨大,听说接近50k就是超过50000个数位相加,可想而知他多神. 看来题目也是考IQ啊! 如果以为是超级水题,按照一般加减法做,肯定是WA了. 这里给出使用string的加减法运算,因为string是长度可增可减的,所以不管是多少位,只要内存支持,那么本算法都可以支持了.也可以使用vector这些容器.不过string应该更加省点内存. 注意: POJ比较讨厌的就是不支持C+

字符串大数加减运算问题

这里自己利用STL模板中的容器和链表实现字符串大数加减运算. 1 #include<iostream> 2 #include<vector> 3 #include<list> 4 using namespace std; 5 6 list<char> Input_Number(list<char> ilist)//输入链表字符串,以‘#’作为结束符 7 { 8 cout<<"please Input string ,end

【算法】大数加减

超长的整型加减法可以用数组int来存储,每个单元可以存储1~9位数字,然后模拟手算过程 大数乘除法,稍复杂,(挖坑)续更.. ====================分割线==================== 1 /************************************************* 2 Copyright: CheerM 3 Author: CheerM 4 Date: 2016-11-02 5 Description: 实现超长int型的加减运算.输入任意长

大数加减乘法

大数的相关计算问题一直是编程比赛常考的题目,在蓝桥杯比赛之前又把大数的加减乘法做了一遍.大数除法比较难,还没有去尝试实现,以后有机会了再继续补全好了. 算法分析:三种方法相似,都是按位操作,动态存储.处理好输入数据后,对每一位的逐个操作,很容易得到答案. 大数加法 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #define MAX 1010 using n

大数加减运算

1 #include<iostream> 2 #include<string> 3 4 using namespace std; 5 6 void BDplus(string str1, string str2) 7 { 8 int len1 = str1.length(); 9 int len2 = str2.length(); 10 char *value = NULL; 11 if (len1 >= len2) 12 { 13 //value= (char*)mallo

SPOJ VLATTICE - Visible Lattice Points 【“小”大数加减】

题目链接 一道比较简单的莫比乌斯反演,不过ans会爆long long,我是用结构体来存结果的,结构体中两个LL型变量分别存大于1e17和小于1e17的部分 #include<bits/stdc++.h> using namespace std; typedef long long LL; const int maxn=1e6; int prime[maxn+5]; bool check[maxn+5]; int mu[maxn+5]; void init() { mu[1]=1; int t

不用”if“,”?:“,”switch“或其他判断语句,求两个数中较大的数或较小的数

以下五种方法分别求出较大的数和较小的数的方法.较小数的代码在注释中,但未运行测试. int Find1(int a, int b) { return ((a + b) + abs(a - b)) / 2; //return ((a + b) - abs(a - b)) / 2; } /* 当a大于b时,a-b为正,右移sizeof(int) * 8 - 1后,最右侧一位为0,0^1 = 0: 当a小于b时,a-b为负,右移后最右侧一位为1,1^1 = 1 */ int Find21(int a,