大整数相加 a+b 的c语言实现

终于来到我所期盼的高精度整数相加的题目了。这个题很经典,也算是一个很好的算法入门题吧。

如果是java的话,系统类库已经内置了BigInteger类,直接调用就可以很轻易地解决了。但是学习c的编写也是非常有意义的。

解题思路

1、首先用两个数组s1,s2临时存放输入的数据

2、输入以后将两个数组s1、s2以si[i]-‘0‘的方式把输入的字符串型数字转化为int型的数字。

注意转换的过程中,要倒过来存,以便相加的时候低位的对齐,从低位开始相加。

3、相加的过程:同位相加,相加的结果存放在num1[i]里。如果结果>10,num[i+1]要进位(+1),并且num1[i]存放结果-10(只存放个位)

4、输出时:相加的过程中变量i一直向后移,到了最后会停在max(len(s1),len(s2))+1的位置。如果前面的加法恰好在最高位也进1,此时num1[i]就不为零。此时就要把这个多出来的高位也输出。反则不需要输出。

其他详解看代码注释。

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     char s1[1000],s2[1000];
 6     int num1[1000],num2[1000],len1,len2,i,j;
 7     memset(num1,0,sizeof(num1));
 8     memset(num2,0,sizeof(num2));
 9     while(scanf("%s%s",s1,s2)!=EOF)
10     {
11         len1=strlen(s1);
12         len2=strlen(s2);
13         for(i=len1-1,j=0; i>=0; --i) //从后往前处理大数字符串,把字符串变成数字组
14         {
15
16             num1[j]=s1[i]-‘0‘;
17             j++;
18
19         }
20         for(i=len2-1,j=0; i>=0; --i)
21         {
22             num2[j]=s2[i]-‘0‘;
23             j++;
24
25         }
26         //相加的处理,把num2的数加到i1中。进位加1,原超数-10
27
28         for(i=0; i<(len2>len1?len2:len1); i++)
29         {
30             num1[i]+=num2[i];
31             if(num1[i]>9)
32             {
33                 num1[i+1]+=1;
34                 num1[i]-=10;
35             }
36         }
37         if(num1[i])//如果最后一位不为0,把溢出来的那一位也输出。输出倒着输
38             for(j=i; j>=0; j--)
39                 printf("%d",num1[j]);
40         else for(j=i-1; j>=0; j--)//如果最后一位为0,最高位不需要输出。
41                 printf("%d",num1[j]);
42         memset(num1,0,sizeof(num1));
43         memset(num2,0,sizeof(num2));
44         printf("\n");
45     }
46     return 0;
47 }

原文地址:https://www.cnblogs.com/AKsnoopy/p/8310426.html

时间: 2024-11-08 15:38:44

大整数相加 a+b 的c语言实现的相关文章

算法---大整数相加

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

实现大整数相加(考虑符号位,可能有负整数) 思维严谨程度!!

//实现大整数相加 //还得考虑符号位,一个比另一个短 #include<iostream> #include <string> #include <cstring> using namespace std; #define maxlen 2001 int a[maxlen]; int b[maxlen]; int len1, len2, i, j; int bigger(int a, int b) { return a>b ? a : b; } void Add

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

A + B Problem II Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B. Input The first line of the input c

SOJ 1002/1003/1004 大整数相加/相乘/相除

三个题目分别考察大整数相加相乘相除运算.如果按照传统算法是取一个长数组,之后进行模拟或者FFT来进行运算.但是相对繁琐. 后来昨天的青岛区域赛网赛1001,用到了JAVA的BigDecimal,于是反过来想到了这几个题目.用JAVA写了以后果然很简单. 1002:大数相加: AC代码: import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { // TO

ACM: A + B Problem II (两个大整数相加)

Code: #include <stdlib.h> #include <stdio.h> #include <string.h> #define MAX 1000 //给数组赋值 void arrV(int a[],int len,int p){ int i; for(i=0;i<len;i++){ a[i]=p; } } //打印数组中的运算结果 void printRverse(int a[]){ int len=0,i=0; while(a[i]!=-1){

[Java]#从头学Java# Java大整数相加

重操旧业,再温Java,写了个大整数相乘先回顾回顾基本知识.算法.效率什么的都没怎么考虑,就纯粹实现功能而已. 先上代码: 1 package com.tacyeh.common; 2 3 public class MyMath { 4 5 public static String BigNumSum(String... n) { 6 int length = n.length; 7 StringBuilder result = new StringBuilder(); 8 //这里判断其实不需

C++ string 实现大整数相加减

任意两个大整数的加减算法,可自动判断正负号,代码如下: #include <iostream> #include <vector> #include <cstring> #include <algorithm> #include <string> using namespace std; string BigInegerAdd(string s1, string s2) // s1+s2; { int len = s1.size()>s2.

如何实现大整数相加

思路:在程序中列出 "竖式" ,然后逐位相加.究竟是什么样子呢?我们以 426709752318 + 95481253129 为例,来看看大整数相加的详细步骤: 第一步,把整数倒序存储,整数的个位存于数组0下标位置,最高位存于数组长度-1下标位置.之所以倒序存储,更加符合我们从左到右访问数组的习惯. 第二步,创建结果数组,结果数组的最大长度是较大整数的位数+1,原因很明显. 第三步,遍历两个数组,从左到右按照对应下标把元素两两相加,就像小学生计算竖式一样. 例子中,最先相加的是数组A的

大整数相加问题

#include <iostream> #include <string> /*project:两个大整数相加 **@author:浅滩 **data:2019.05.15 */ using namespace std; void add(const string &,const string &); int main() {int n; string str1,str2; cin>>str1>>str2; add(str1,str2); }