算法-大整数加法

简介:

注意这里是整数,浮点数需要额外的操作,实现大整数的加减,三个栈就OK了,两个运算整数栈,一个结果栈,基本的逻辑的就是利用栈的先入后出的特点将高位push到栈底,低位push到栈顶,之后两个栈pop出来之后push到结果栈,结果栈pop出来就是我们想要的结果。

Stack.h:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@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代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
@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中实现:

1
2
3
4
5
@interface  StackSum :  NSObject
 
-( NSInteger )sum:( NSInteger )firstNumber  secondNumber:( NSInteger )secondNumber;
 
@end

StackSum.m中的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
@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   *str=@ "" ;
     //正序输出即为结果
     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

 简单的测试:

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

结果如下:

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4569658.html,如需转载请自行联系原作者

相关文章
|
算法 C++
剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)
剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)
|
算法 C++ Python
【每日算法Day 66】经典面试题:不用四则运算如何做加法?
【每日算法Day 66】经典面试题:不用四则运算如何做加法?
135 0
|
存储 算法 大数据
基础算法-高精度加法
为什么要使用高精度算法 C++ 每一个变量都有自己的类型,每个类型都有自己的存储长度范围。
|
存储 算法
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
155 0
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
|
算法
算法题每日一练---第55天:不用加号的加法
设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。
164 2
算法题每日一练---第55天:不用加号的加法
|
机器学习/深度学习 自然语言处理 算法
|
算法
【刷算法】不用加减乘除怎么做加法?
【刷算法】不用加减乘除怎么做加法?
|
算法 Java 计算机视觉
常用的像素操作算法:图像加法、像素混合、提取图像中的ROI
常用的像素操作算法:图像加法、像素混合、提取图像中的ROI
395 0
常用的像素操作算法:图像加法、像素混合、提取图像中的ROI
DL之BP:利用乘法层/加法层(forward+backward)算法结合计算图(CG)求解反向求导应用题
DL之BP:利用乘法层/加法层(forward+backward)算法结合计算图(CG)求解反向求导应用题
DL之BP:利用乘法层/加法层(forward+backward)算法结合计算图(CG)求解反向求导应用题

热门文章

最新文章