hdu 1753 大明A+B(大数)

题意:小数大数加法

思路:大数模板

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

void plu(char *a,char *b){//注意存储方式:整数倒着存,小数正着存,看代码需注意
    int i,j,k,lena,lenb,lena1,lena2,lenb1,lenb2,lenc1,lenc2;//len分别对应相应数组的长度
    char a1[1024],a2[1024],b1[1024],b2[1024],c1[1024],c2[1024];//a1、a2为第一个数的整数部分、小数部分
    lena=strlen(a);//b1、b2为第二个数;c1、c2为结果
    lenb=strlen(b);
    //取出第1个数的整数部分、小数部分
    for(i=0;i<lena;++i)
        if(a[i]==‘.‘)
            break;
    lena1=i;
    lena2=lena-i-1;
    for(j=i-1,k=0;j>=0;--j)
        a1[k++]=a[j];
    for(j=i+1,k=0;j<lena;++j)
        a2[k++]=a[j];

    //取出第2个数的整数部分、小数部分
    for(i=0;i<lenb;++i)
        if(b[i]==‘.‘)
            break;
    lenb1=i;
    lenb2=lenb-i-1;
    for(j=i-1,k=0;j>=0;--j)
        b1[k++]=b[j];
    for(j=i+1,k=0;j<lenb;++j)
        b2[k++]=b[j];

    //开始计算
    int up=0;//进位
    //计算小数部分
    if(lena2>lenb2){
        lenc2=lena2;
        for(i=lena2-1;i>=lenb2;--i)
            c2[i]=a2[i];
        for(;i>=0;--i){
            c2[i]=a2[i]+b2[i]-‘0‘+up;
            if(c2[i]>‘9‘){
                up=1;
                c2[i]-=10;
            }
            else up=0;
        }
    }
    else{
        lenc2=lenb2;
        for(i=lenb2-1;i>=lena2;--i)
            c2[i]=b2[i];
        for(;i>=0;--i){
            c2[i]=a2[i]+b2[i]-‘0‘+up;
            if(c2[i]>‘9‘){
                up=1;
                c2[i]-=10;
            }
            else up=0;
        }
    }
    while(c2[lenc2-1]==‘0‘&&lenc2>=1)--lenc2;//去除后面多余的0
    //计算整数部分
    if(lena1>lenb1){
        lenc1=lena1;
        for(i=0;i<lenb1;++i){
            c1[i]=a1[i]+b1[i]-‘0‘+up;
            if(c1[i]>‘9‘){
                up=1;
                c1[i]-=10;
            }
            else up=0;
        }
        for(;i<lena1;++i){
            c1[i]=a1[i]+up;
            if(c1[i]>‘9‘){
                up=1;
                c1[i]-=10;
            }
            else up=0;
        }
    }
    else{
        lenc1=lenb1;
        for(i=0;i<lena1;++i){
            c1[i]=a1[i]+b1[i]-‘0‘+up;
            if(c1[i]>‘9‘){
                up=1;
                c1[i]-=10;
            }
            else up=0;
        }
        for(;i<lenb1;++i){
            c1[i]=b1[i]+up;
            if(c1[i]>‘9‘){
                up=1;
                c1[i]-=10;
            }
            else up=0;
        }
    }

    if(up==1)printf("1");//最后有进位

    for(i=lenc1-1;i>=0;--i)
        printf("%c",c1[i]);

    if(lenc2>0){
        printf(".");
        for(i=0;i<lenc2;++i)
            printf("%c",c2[i]);
    }
    printf("\n");
}

int main(){
    char a[1024],b[1024];
    while(~scanf("%s%s",a,b))
        plu(a,b);
    return 0;
}

时间: 2024-08-28 00:18:19

hdu 1753 大明A+B(大数)的相关文章

HDU 1753 大明A+B

大明A+B Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 13326    Accepted Submission(s): 4886 Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明".这时他已经不是那个只会做100以内加法的那个"小明"了,

HDU高精度总结(java大数类)

  HDU1002   A + B Problem II [题意]大数相加 [链接]http://acm.hdu.edu.cn/showproblem.php?pid=1002 Sample Input 2 1 2 112233445566778899 998877665544332211 Sample Output Case 1: 1 + 2 = 3 Case 2: 112233445566778899 + 998877665544332211 = 1111111111111111110 代码

HDOJ 1753 大明A+B

JAVA大数.... 大明A+B Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7763    Accepted Submission(s): 2748 Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是那个只会做100以内加法的那个&quo

HDU 4927 Series 1(推理+大数)

HDU 4927 Series 1 题目链接 题意:给定一个序列,要求不断求差值序列,直到剩一个,输出这个数字 思路:由于有高精度一步,所以要推理一下公式,其实纸上模拟一下很容易推出公式就是一个类似杨辉三角的组合数求和,不过奇数位置是加,偶数位置是减,然后高精度过掉 代码: 本人的第一个JAVA程序^ ^ import java.util.Scanner; import java.math.BigInteger; public class Main { public static void ma

HDU 4006 求第k大数 treap

裸题,瞬秒.. #include <stdio.h> #include <iostream> #include <algorithm> #include <math.h> #include <vector> #include <set> #include <map> #include <queue> using namespace std; #define L(id) tree[id].ch[0] #defin

【HDOJ】1753 大明A+B

注意数据格式,可以是整数,并且注意输出最简化浮点数. 1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAXNUM 420 5 6 char a[MAXNUM], b[MAXNUM], c[MAXNUM], d[MAXNUM]; 7 int lena, lenb; 8 int posa, posb; 9 10 int addf(int bega, int begb, int *carry); 11 int addi(in

HDU 4927 Series 1 java大数

java mle前会wa 或者 t 这种事我会乱说? import java.math.*; import java.util.*; import java.io.*; public class Main { BigInteger[] a = new BigInteger[3007]; public void work() { int T; T = cin.nextInt(); while (T-- > 0) { int n; n = cin.nextInt(); for (int i = 0;

hdu 4873 ZCC Loves Intersection(大数+概率)

题目链接:hdu 4873 ZCC Loves Intersection 题目大意:给出N,D,表示在一个D维的坐标上,坐标范围为0~N-1.在这个坐标系中有D条线段,分别平行与各个坐标轴,每秒会根据题目中的伪代码随机生成各个线段的位置.两条直线相交的话会得一分,问每秒得分的期望. 解题思路:总的情况(ND?1?C(2N))D,两条直线相交的得分C(2D)?s2?ND?2?(ND?2?C(2N))D?2 s是在二维情况下的分的情况数s=∑i=1N((N?i+1) i?1)=N3+3?N2?4?N

HDOJ/HDU 1250 Hat&#39;s Fibonacci(大数~斐波拉契)

Problem Description A Fibonacci sequence is calculated by adding the previous two members the sequence, with the first two members being both 1. F(1) = 1, F(2) = 1, F(3) = 1,F(4) = 1, F(n>4) = F(n - 1) + F(n-2) + F(n-3) + F(n-4) Your task is to take