杭电1002

//此题的要点在于 把数字当字符串储存 用数组储存//计算的时候注意要减去‘0’,因为那是我们的字符串//在我们换算 的时候一定要加上temp 我就是因为没加 错了一个下午#include <iostream>
#include<string>
using namespace std;

int main()
{
     int n;
     cin>>n;
      int ui=1;
     while(n--){
     string a,b;
     int sum[1001];//用来放结果
    cin>>a>>b;

     int lena,lenb;

     lena=a.length();
     lenb=b.length();
    // cout<<lena<<" "<<lenb<<endl;

     int ka=lena-1;
     int kb=lenb-1;
     int q=0;//用来表示数组下标
     int temp=0;//用来表示进位
    // cout<<a[2]+a[1]-‘0‘-‘0‘<<endl;

    while(lena!=0&&lenb!=0)
     {
         int numa=a[ka]-‘0‘;//和 因为string是字符类 要减去0的ascii码
         int numb=b[kb]-‘0‘;

       //cout<<numa<<" " <<numb<<endl;
    sum[q]=(numa+numb+temp)%10;//我们要的是余数位
        if((numa+numb+temp)>=10){  //这里的每一次判断必须加上temp进位
            temp=1;
        }else{
            temp=0;
        }
        q++;
        ka--;
        kb--;
        lena--;
        lenb--;
     }

     //cout<<a[ka]<<endl;

     if(lena>lenb){
        while(lena){
        int numa=a[ka]-‘0‘ ;
        sum[q]=(numa+temp)%10;//我们要的是余数位

       temp=(numa+temp)/10;
         q++;
        ka--;
       // kb--;
        lena--;
        //lenb--;
        }
     }

     else if(lenb>lena){
        while(lenb){
            int numb=b[kb]-‘0‘;
            sum[q]=(numb+temp)%10;

           temp=(numb+temp)/10;
            q++;
            kb--;
            lenb--;
        }
     }

   else {
   if(temp==1){
            sum[q]=1;
            q++;
        }

   }

    cout<<"Case "<<ui<<":"<<endl;
    ui++;
    int alll=a.length();
    int blll=b.length();
    for(int j=0;j<alll;j++)
    {
        cout<<a[j];
    }
    cout<<" + ";
    for(int jk=0;jk<blll;jk++)
    {
        cout<<b[jk];
    }
    cout<<" = ";
    for(int i=q-1;i>=0;i--){
        cout<<sum[i];

    }

    if(n==0){
        cout<<endl;
    }
    else{
    cout<<endl;
    cout<<endl;
    }

}

    return 0;
}

然而,我花了一个下午。其实就是把temp给弄错了

错误代码为:

while(lena!=0&&lenb!=0)
     {
         int numa=a[ka]-‘0‘;//和 因为string是字符类 要减去0的ascii码
         int numb=b[kb]-‘0‘;

       //cout<<numa<<" " <<numb<<endl;
    sum[q]=(numa+numb+temp)%10;//我们要的是余数位
        if((numa+numb)>=10){  //就是这边错了!!!!!!
            temp=1;
        }else{
            temp=0;
        }
        q++;
        ka--;
        kb--;
        lena--;
        lenb--;
     }

bug为:

时间: 2024-10-18 06:24:15

杭电1002的相关文章

杭电 1002 A + B Problem II(大数处理)

A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 209179    Accepted Submission(s): 40226 Problem Description I have a very simple problem for you. Given two integers A and B, yo

大数A+B 【杭电-1002】 附题

/* A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 209912    Accepted Submission(s): 40404 Problem Description I have a very simple problem for you. Given two integers A and B,

杭电 1002 A + B Problem II【大数相加】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1002 解题思路:就是把大的数用数组存放起来,像小学的时候用竖式加法来算两个数相加那样算: 反思:思路很简单,可是有很多细节考虑不好,有时候没有进位,有时候又没有输出正确的答案,然后有时候数组长度又开小了什么的,所以还要多多练习. #include<stdio.h> #include<string.h> #define max 1000 void add(char a[],char b[

A + B Problem II(杭电1002)

/*A + B Problem II Problem 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 contains an integer T(1<=T<=20) which means the number of test case

java学习(9):杭电1002.大数处理问题

import java.math.BigDecimal; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String temp1 = null; String temp2 = null; String result = null; int i; int a = scanner.nextI

杭电1002(大数相加)

第一道大数,做这个题要细心,, #include<stdio.h> #include<string.h> int main() { int m,n; scanf("%d",&n); m=1; while(n--) { int i,j,k,t; char a[1001],b[1001],c[1001]={0}; scanf("%s %s",&a,&b); if(strlen(a)>=strlen(b)) { for

HDU 4908 (杭电 BC #3 1002题)BestCoder Sequence(DP)

题目地址:HDU 4908 这个题是从m开始,分别往前DP和往后DP,如果比m大,就比前面+1,反之-1.这样的话,为0的点就可以与m这个数匹配成一个子串,然后左边和右边的相反数的也可以互相匹配成一个子串,然后互相的乘积最后再加上就行了.因为加入最终两边的互相匹配了,那就说明左右两边一定是偶数个,加上m就一定是奇数个,这奇数个的问题就不用担心了. 代码如下: #include <iostream> #include <stdio.h> #include <string.h&g

杭电acm 1002 大数模板(一)

从杭电第一题开始A,发现做到1002就不会了,经过几天时间终于A出来了,顺便整理了一下关于大数的东西 其实这是刘汝佳老师在<算法竞赛 经典入门 第二版> 中所讲的模板,代码原封不动写上的,但是经过自己的使用与调试也明白了其中的内涵. 首先定义大数的结构体: struct BigNum{ static const int BASE=100000000; static const int WIDTH=8; vector<int> s; BigNum(long long num=0){

HDU 4961(杭电多校#9 1002题)Boring Sum(瞎搞)

题目地址:HDU 4961 看来这题的测试数据是随机的.不然出了极限数据还真过不了...这题我的方法是建一个哈希结构体,记录两个变量,分别是num位置,然后是f,f==0表示这个数没出现过,f==1表示这个数出现过.然后分别从前面和后面扫一遍.每次扫的时候,对每一个出现的数都进行标记.然后对当前的数枚举该数的倍数,全部枚举完,取位置num最大的.然后找完之后,对哈希结构体进行更新.如果前面曾经出现过的话,就直接换掉,因为后面的数总比前面的更优.最后扫完两遍之后两个数组就能求出来了.计算就行了.