大数运算——加法

作为一个对编程没有很深研究的初学者,对于这些虽然没有任何算法的题仍然觉得很难很难,但是或许都是需要一个过渡时期吧,这是这几天的结果,很多有自己的考虑,自己的想法在里面,但是也百度查了很多,也看了很多别人写的关于这方面的。

先看一下关于大数方面的知识:

     bool型为布尔型,占1个字节,取值0或1。

     BOOL型为int型,一般认为占4个字节,取值TRUE/FALSE/ERROR。

     sbyte型为有符号8位整数,占1个字节,取值范围在128~127之间。

     bytet型为无符号16位整数,占2个字节,取值范围在0~255之间。

     short型为有符号16位整数,占2个字节,取值范围在-32,768~32,767之间。

     ushort型为无符号16位整数,占2个字节,取值范围在0~65,535之间。

     int型为有符号32位整数,占4个字节,取值范围在-2,147,483,648~2,147,483,647之间。

     uint型为无符号32位整数,占4个字节,取值范围在0~4,294,967,295之间。

     long型为64位有符号整数,占8个字节,取值范围在9,223,372,036,854,775,808~9,223,372,036,854,775,807之间。

     ulong型为64位无符号整数,占8个字节,取值范围在0~18,446,744,073,709,551,615之间。

     float型为32位单精度实数,占4个字节,取值范围3.4E+10的负38次方~3.4E+10的38次方之间。

     double型为64位实数,占8个字节,取值范围1.7E+10的负308次方~1.7E+10的正308次方。

这几天一直在做关于大数运算的题,就两道题我也是醉了,第一道是字符串型的,用了好久好久,提交了好多次,最后知道是哪错了吗,原来是flag这个变量没给初值,等具体的原因会在下面细说,第二道是多次大数相加,因为是我是大一新生么,对于编程很多复杂的东西还是不熟悉的,好比函数,我直到现在对它还是很模糊,现在对它真的是又爱又恨啊,因为我驾驭不了它,但是我会好好努力的。

其实关于大数加法思路其实比较简单的,但是有几点要注意的:1.要先给把存大数的数组要先归零;2.要把大数倒着存放到一个数组里面(这要避免了因为大数的长度不同而要考虑的所有问题,记得刚开始做的时候就不是这种思维);3.倒着输出即可;4.有时候要考虑0的问题。

所以让我们来看两个例题吧

1.Martian Addition

In the 22nd Century, scientists have discovered intelligent residents live on the Mars. Martians are very fond of mathematics. Every year, they would hold an Arithmetic Contest on Mars (ACM). The task of the contest is to calculate the sum of two 100-digit numbers, and the winner is the one who uses least time. This year they also invite people on Earth to join the contest.

As the only delegate of Earth, you’re sent to Mars to demonstrate the power of mankind. Fortunately you have taken your laptop computer with you which can help you do the job quickly. Now the remaining problem is only to write a short program to calculate the sum of 2 given numbers. However, before you begin to program, you remember that the Martians use a 20-based number system as they usually have 20 fingers.

Input:

You’re given several pairs of Martian numbers, each number on a line.

Martian number consists of digits from 0 to 9, and lower case letters from a to j (lower case letters starting from a to present 10, 11, …, 19).

The length of the given number is never greater than 100.

Output:

For each pair of numbers, write the sum of the 2 numbers in a single line.

Sample Input:

1234567890

abcdefghij

99999jjjjj

9999900001

Sample Output:

bdfi02467j

iiiij00000

#include<stdio.h>
#include<string.h>
int main()
{
    int q[150], p[150], sum[150], i, j, len1, len2, flag, count;
    char a[150], b[150];
    while(scanf("%s %s",a, b)==2)
    {
        count=0;
        len1=strlen(a);
        len2=strlen(b);
        flag=101;//一定要初始化,否则当sum[100]!=0时候就不会执行flag=i这一步了,就会对后面的for循环产生影响
        memset(q, 0, sizeof(q));
        memset(p, 0, sizeof(p));
        memset(sum, 0, sizeof(sum));//把要存数的数组归零处理
        for(i=len1-1, j=0;i>=0;i--, j++)//倒着存数
        {
            if(a[i]>=‘0‘&&a[i]<=‘9‘)
            {
                p[j]=a[i]-‘0‘;
            }
            else if(a[i]>=‘a‘&&a[i]<=‘j‘)
            {
                p[j]=a[i]-‘a‘+10;
            }
        }
        for(i=len2-1, j=0;i>=0;i--, j++)
        {
            if(b[i]>=‘0‘&&b[i]<=‘9‘)
            {
                q[j]=b[i]-‘0‘;
            }
            else if(b[i]>=‘a‘&&b[i]<=‘j‘)
            {
                q[j]=b[i]-‘a‘+10;
            }
        }
        for(i=0;i<101;i++)
        {
            sum[i]+=p[i]+q[i];
            if(sum[i]>19)
            {
                sum[i]-=20;
                sum[i+1]++;
            }
        }
        for(i=100;i>=0;i--)
        {
            if(sum[i]!=0)
            {
                break;
            }
            else
            {
                count++;
            }
            flag=i;
        }
        if(count==101)
        {
            printf("0");//对0特殊处理(如果有好方法的话求告诉)
        }
        for(i=flag-1;i>=0;i--)
        {
            if(sum[i]>=0&&sum[i]<=9)
            {
                printf("%d",sum[i]);
            }
            else
            {
                if(sum[i]==10)
                {
                    printf("a");
                }
                else if(sum[i]==11)
                {
                    printf("b");
                }
                else if(sum[i]==12)
                {
                    printf("c");
                }
                else if(sum[i]==13)
                {
                    printf("d");
                }
                else if(sum[i]==14)
                {
                    printf("e");
                }
                else if(sum[i]==15)
                {
                    printf("f");
                }
                else if(sum[i]==16)
                {
                    printf("g");
                }
                else if(sum[i]==17)
                {
                    printf("h");
                }
                else if(sum[i]==18)
                {
                    printf("i");
                }
                else if(sum[i]==19)
                {
                    printf("j");
                }
            }
        }
        printf("\n");
    }
    return 0;
}

就这个题,真的做了好久好久,当过的那一刹那,真的好激动,好兴奋,好高兴,虽然,自己现在是很差,但是努力ing。

2.Integer Inquiry

One of the first users of BIT’s new supercomputer was Chip Diller. He extended his exploration of powers of 3 to go from 0 to 333 and he explored taking various sums of those numbers.

This supercomputer is great,‘‘ remarked Chip.I only wish Timothy were here to see these results.” (Chip moved to a new apartment, once one became available on the third floor of the Lemon Sky apartments on Third Street.)

Input

The input will consist of at most 100 lines of text, each of which contains a single VeryLongInteger. Each VeryLongInteger will be 100 or fewer characters in length, and will only contain digits (no VeryLongInteger will be negative).

The final input line will contain a single zero on a line by itself.

Output

Your program should output the sum of the VeryLongIntegers given in the input.

This problem contains multiple test cases!

The first line of a multiple input is an integer N, then a blank line followed by N input blocks. Each input block is in the format indicated in the problem description. There is a blank line between input blocks.

The output format consists of N output blocks. There is a blank line between output blocks.

Sample Input

1

123456789012345678901234567890

123456789012345678901234567890

123456789012345678901234567890

0

Sample Output

370370367037037036703703703670

#include<stdio.h>
#include<string.h>
int sum[150];
char s[150];
void add(char a[])
{
    int len, i, j;
    len=strlen(a);
    for(i=len-1, j=0;i>=0;i--, j++)
    {
        sum[j]+=(a[i]-‘0‘);
        sum[j+1]+=sum[j]/10;
        sum[j]%=10;
    }
}
int main()
{
    int n, i, flag, count;
    while(~scanf("%d",&n))
    {
        while(n--)
        {
            memset(sum, 0,sizeof(sum));
            while(scanf("%s", s)==1)
            {
                add(s);
                if(strcmp(s, "0")==0)
                {
                    break;
                }
            }
            flag=0;
            for(i=100;i>=0;i--)
            {
                if(flag==0&&sum[i]==0)
                {
                    continue;
                }
                else
                {
                    flag=1;
                    printf("%d", sum[i]);
                }
            }
            if(n!=0)
            {
                printf("\n");
            }
            printf("\n");
        }
    }
    return 0;
}

这个是利用函数做的,以前,还没什么感觉,觉得函数没什么很大的用处,现在才小有体会,觉得函数真的很好,所以呢,函数一定要学好,它真的很有用。

体会:

这几天做完了这两道关于大数的题,我真的受益颇丰,我会因为不知道思路而苦恼,会因为不知道哪错了而采取很多方法,我会因为这道题 过了而哈哈哈大笑,真的,那时候才知道为完成一件事而去奋斗的滋味,也尝到了自己努力后的甘果,我知道对于编程方面任重道远,而且曾经有人答应过我会尽全力帮我,但是,他食言了,不知道有什么难言之隐,反正变化好快,但是,随他去吧,顺其自然吧。在编程方面我需要学的还有很多很多,我会继续努力的,加油。———他人成十,我便做百;他人成百,我便做千。加油!!

时间: 2024-12-23 21:15:29

大数运算——加法的相关文章

五:大数运算-加法运算

问题 : 大数-加法运算题目描述请计算两个整数相加(数的范围:0 <= num < 10 ^ 100)输入两个整数输出一个整数样例输入10000001000000样例输出2000000 1 #include<stdio.h> 2 #include<string.h> 3 #define M 100000 4 int Inter_Sum[M]; 5 void fun(char str1[],char str2[]){ 6 int t,m=0,i=strlen(str1);

剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现

用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具体的计算中,还是要将字符串转化成字符数组来进行计算. 实现两个大数的加法,要考虑到两个问题,两个数的和的位数问题,以及如何处理两个数按位相加产生的进位问题.首先两个整数相加,两个数的和的位数最多比最大的整数的位数多1:这样和的位数就确定了.对于进位问题,我的做法是先进行按位相加,相加操作完成后再按照

大数运算之字符串模拟

相信大家被特别大的两个数据做运算折磨过.当两个操作数或者运算结果超过类型的表示范围后会有意想不到的错误,这时候我们的电脑还不如我们高中用过的科学计算器,这是作为一个程序员所不能忍受的.所以我们得找到其他的方式来计算.这就是我们今天要讨论的字符串模拟大数运算. 我们的运算一般使用int类型来算的,那么首先我们先复习一下各种int类型的数据表示范围: unsigned int 0-4294967295    int   -2147483648-2147483647  unsigned long 0-

HDU 4927 大数运算

模板很重要 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define MAXN 9999 #define MAXSIZE 10 #define DLEN 4 class BigInt { private: int a[500]; //可以控制大数的位数 i

C++实现大数运算

项目背景: 大数运算,顾名思义,就是很大的数值的数进行一系列的运算. 我们知道,在数学中,数值的大小是没有上限的,但是在计算机中,由于字长的限制,计算机所能表示的范围是有限的,当我们对比较小的数进行运算时,如:1234+5678,这样的数值并没有超出计算机的表示范围,所以可以运算.但是当我们在实际的应用中进行大量的数据处理时,会发现参与运算的数往往超过计算机的基本数据类型的表示范围,比如说,在天文学上,如果一个星球距离我们为100万光年,那么我们将其化简为公里,或者是米的时候,我们会发现这是一个

java 大数运算[转]

用JAVA 实现算术表达式(1234324234324 + 8938459043545)/5 + 343434343432.59845 因为JAVA语言中的long 定义的变量值的最大数受到限制,例如123456789987654321这样的整数就不能存放在long类型的变量中,如果这样两个大数相加或相乘,产生的结果会更大.比如,JAVA语言中如果使用long l = 1000000000这样定义没错,但如果加上2000000000变成 1000000000+2000000000测试结果就为-1

大数运算模板

大整数加法 /* 大整数加法 调用方式:add(a, b); 返回类型:string */ string add(string a, string b) { string s; reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); int i = 0; int m, k = 0; while(a[i] && b[i]) { m = a[i] - '0' + b[i] - '0' + k; k = m / 10; s += (m

大数运算——字符串操作结合“竖式计算“思想的实现

总体原则: 字符串转整形数组,然后按照“竖式计算”的思想,按位(对于数组来说,就是对应位置的元素)进行运算,同时处理进位.退位.最后将整形数组转换为字符串输出. Ps:1.字符串转整形,本文采取逆序存储的方式,即将字符串的低位(大数的高位)放置到整形数组的高位. 2.本文提供的四个四则运算方法,所有的输入值(大数)必须为正整数. 一.加法 加法运算遵循从低位到高位运算的法则.将字符串转换为整形数组后,两数组对应元素相加,结果存储至结果数组的相应元素位置.同时对相加后的元素进行整除和取余运算(整除

大数运算之 Java BigInteger 的基本用法

大数运算之 Java BigInteger 的基本用法 在程序设计竞赛中会遇到高精度运算的问题,C++没有高精度运算,只能手动模拟人工运算,手动实现高精度,而 java.math 包中的 BigInteger 提供了高精度的基本运算,因此竞赛中常用 Java 解决高精度运算问题. 当然如果比赛支持 python 就当我没说. BigInteger 对象的创建 BigInteger 类在 java.math.BigInteger 包中,首先引用该包. import java.math.BigInt