算法-大整数加法

注意这里是整数,浮点数需要额外的操作,实现大整数的加减,三个栈就OK了,两个运算整数栈,一个结果栈,基本的逻辑的就是利用栈的先入后出的特点将高位push到栈底,低位push到栈顶,之后两个栈pop出来之后push到结果栈,结果栈pop出来就是我们想要的结果。看起来还不错,如果有兴趣就看下面的代码,代码通过OC实现,原理类似:

鉴于OC没有Stack,先简单实现一个栈吧:

Stack.h:

@interface Stack : NSObject
//栈顶的元素
@property  (strong,nonatomic) Node  *first;

@property  (assign,nonatomic) NSInteger  count;

-(BOOL)isEmpty;

-(NSInteger)size;

-(void)push:(NSString *)value;

-(NSString *)pop;

-(void)remove:(NSString *)value;

@end

Stack.m代码:

@implementation Stack

-(BOOL)isEmpty{
    return self.count==0;
}

-(NSInteger)size{
    return self.count;
}

-(void)push:(NSString *)value{
    Node  *oldFirst=self.first;
    self.first=[[Node alloc]init];
    self.first.value=value;
    self.first.next=oldFirst;
    self.count=self.count+1;
}

-(NSString *)pop{
    if (!self.first) {
        return [NSString stringWithFormat:@"-1"];
    }
    NSString *value=self.first.value;
    self.first=self.first.next;
    self.count=self.count-1;
    return value;
}

-(void)remove:(NSString *)value{
    if ([self.first.value isEqualToString:value]) {
        self.first=self.first.next;
        self.count=self.count-1;
    }else{
        Node *node=self.first;
        while (node.next) {
            if ([node.next.value isEqualToString:value]){
                if (node.next.next) {
                    Node *tempNode=node.next.next;
                    node.next=tempNode;
                }else{
                    node.next=NULL;
                }
                self.count=self.count-1;
                break;
            }else{
                node=node.next;
            }

        }
    }
}

@end

进入重点了,整数的加减在StackSum.h中实现:

@interface StackSum : NSObject

-(NSInteger)sum:(NSInteger)firstNumber  secondNumber:(NSInteger)secondNumber;

@end

StackSum.m中的代码:

@implementation StackSum

//原文地址:http://www.cnblogs.com/xiaofeixiang
-(NSInteger)sum:(NSInteger)firstNumber secondNumber:(NSInteger)secondNumber{
    //第一个整数的栈
    Stack  *firstStack=[self getStackByNumber:firstNumber];
    //第二个整数的栈
    Stack  *secondStack=[self getStackByNumber:secondNumber];
    //结果栈
    Stack  *resultStack=[[Stack alloc]init];
    NSInteger  flag=0;//进位标记

    while (firstStack.count>0&&secondStack.count>0) {
        NSInteger  temp=[firstStack.pop integerValue]+[secondStack.pop integerValue]+flag;
        [resultStack push:[NSString stringWithFormat:@"%ld",temp%10]];
        flag=temp/10;
    }
    //第一个数字大于第二字数字的情况
    while (firstStack.count>0) {
        NSInteger  temp=[firstStack.pop integerValue]+flag;
        [resultStack push:[NSString stringWithFormat:@"%ld",temp%10]];
        flag=temp/10;
    }
    //第二个数字大于第一个数字
    while (secondStack.count>0) {
        NSInteger  temp=[secondStack.pop integerValue]+flag;
        [resultStack push:[NSString stringWithFormat:@"%ld",temp%10]];
        flag=temp/10;
    }
    //标记位有进位
    if (flag) {
        [resultStack push:[NSString stringWithFormat:@"%ld",flag]];
    }
    NSInteger  count=resultStack.count;
    NSString  *[email protected]"";
    //正序输出即为结果
    for (NSInteger i=0; i<count; i++) {
        str=[str stringByAppendingString:resultStack.pop];
   }
    return [str integerValue];
}

-(Stack *)getStackByNumber:(NSInteger)value{
    Stack  *stack=[[Stack alloc]init];
    NSString *stringValue=[NSString stringWithFormat:@"%ld",value];
    for (NSInteger i=0; i<[stringValue length]; i++) {
         [stack push:[NSString stringWithFormat:@"%@",[stringValue substringWithRange:NSMakeRange(i, 1)]]];
    }
    return stack;
}

@end

 简单的测试:

    StackSum  *sum=[[StackSum alloc]init];
    NSLog(@"大整数相加的结果为:%ld", [sum sum:9999999 secondNumber:888]);
    NSLog(@"iOS技术交流群:228407086");

结果如下:

随机附赠iOS技术交流群:228407086~

时间: 2024-10-12 23:32:37

算法-大整数加法的相关文章

日常记录(c语言)--字符串实现大整数加法

运行环境:CentOs 64位--vim 最近在看<剑指offer>这本书,看了前面的关于面试的能力,顿时觉得自己的编程能力差得好远. 可能我对鲁棒的代码理解还不深,我觉得鲁棒应该就是代码可以应对各种不同的输入,都能有相应的处理,并给出相应的输出. 下面是我看了之后对之前做过的大整数加法做了一些完善,之前的只能实现对纯数字字符进行求和,甚至连对空指针的处理都没有,好惭愧.我会用注释来记录自己对此算法的理解. 1 #include <stdio.h> 2 #include <s

算法---大整数相加

原文:算法---大整数相加 开通博客开始第一次写发表算法博客.深知一半算法考试都是用C,C++,由于大四开始到今年毕业工作到现在一直从事C#开发,C++用得很少了.链表,指针也只知道一个概念了.用得没以前熟练了.所以后续更新的算法题我都是基于C#语法的.算法主要体现的是解题思路.跟题目一样,本次算法主要实现大数据相加. 解题思路: 1. 将大数据存储到一个链表中,C#中用List<int>来存储,每个节点表示每一位的数字. {1,2,3,4,5} =>12345 和{9,6,5,9,5}

A——大整数加法(HDU1002)

题目: I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B. InputThe first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line co

AC日记——大整数加法 openjudge 1.6 10

10:大整数加法 总时间限制:  1000ms 内存限制:  65536kB 描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. 输出 一行,即相加后的结果.结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342. 样例输入 22222222222222222222 33333333333333333333 样例输出 55555555555555555555 来源 程序设计实习2007 思路: 模拟: 来,上代码:

uva 424(Integer Inquiry)高精度大整数加法

这是一道很标准的大整数加法,我却wa了4次,没提交一次就查到一些细节问题,比如说我们考虑前导 0的问题,还有就是没有对输入数组处理, 使得他们每次输入时高位的置0,还有就是没考虑到最后相加后的进位, 这些问题一一改正之后,还是wa了,原来是因为,我把if语句中的==只写了一个...真坑啊,,,我就说怎么会 不过,明明写的对的,大数相加竟然还wa了四次,还有就是这道题最后不写换行也会wa...看来还是有必要从基础练起提高代码能力: 贴代码: #include<stdio.h> #include&

单链表大整数加法

单链表大整数加法,节点是char型. First     List:   head->1->8->9 Second List:   head->9->8->1 Result  List:    head->1->1->7->0 实现了单链表(单链表类模板),现在使用单链表实现大整数加法 1 #include "stdafx.h" 2 #include "SingleList.h" 3 #include &l

POJ 2506 Tiling(递推+大整数加法)

http://poj.org/problem?id=2506 题意: 思路:递推.a[i]=a[i-1]+2*a[i-2]. 计算的时候是大整数加法.错了好久,忘记考虑1了...晕倒. 1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 7 int n; 8 char s[255][255]; 9 10

HDU - 1002 A + B Problem II (大整数加法)

一道很基础的大整数加法. 简单的说一下思路吧. 先用字符串读取两个大数.首先需要把数组给初始化为0方便以后处理,然后对数组逆序对齐处理,接着相加转化后的两个数组并把之存进结果数组里面,最后对结果数组进行进位处理. 看代码吧. #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> #include <queue> #include <stac

高精度计算(一):大整数加法

C/C++中的int 类型能表示的范围是-231~231 – 1.unsigned 类型能表示的范围是 0 ~232 – 1,即 0~4294967295.所以,int 和unsigned 类型变量,都不能保存超过10 位的整数.有时我们需要参与运算的数,可能会远远不止10 位,例如要求100!的精确值.即便使用能表示的很大数值范围的double 变量,但是由于double变量只有64 位,double 变量的精度也不足以表示一个超过100 位的整数.一般我们称这种基本数据类型无法表示的整数为大