zoukankan      html  css  js  c++  java
  • hdu1002

    题目

    分析:对于此题做法有两种:

    其一,使2字符串的中的字符数字减去'0',逐个相加大于等于10的可以使本位减10,下一位自增1,后面的处理就非常简单了;

    其二,便是读入字符串后先让各个字符减'0',一一对应存入整形数组中;之后再相加。对于2种方法大致是相同的,都要从后面向前加,逢十进位,以及数组初始化均要初始为0,一边方便运算。

    但是我总觉得这道题有bug

    下面是网上一位大牛的代码:虽然AC了但是有些运行结果不正确,抓狂,操,这都能AC我是醉了

    #include<stdio.h>
    #include<string.h>
    int main()
    {
        int n,i,len1,len2,j,k,pi,t,flag;
        char str1[1010],str2[1010];
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            int a[1200]={0};
            flag=0;
            printf("Case %d:
    ",i);
            scanf("%s%s",str1,str2);//以字符串形式读入
            len1=strlen(str1);
            len2=strlen(str2);
            printf("%s + %s = ",str1,str2);
            j=len1-1;
            k=len2-1;
            pi=0;
            while(j>=0&&k>=0)//开始相加
            {
                if(a[pi]+(str1[j]-'0')+(str2[k]-'0')>=10)//相加后大于10的
                {
                    a[pi]=a[pi]+(str1[j]-'0')+(str2[k]-'0')-10;
                    a[pi+1]++;
                }
                else
                    a[pi]=a[pi]+(str1[j]-'0')+(str2[k]-'0');
                pi++;
                k--;
                j--;
            }
            if(j>=0)
            {
                for(t=j;t>=0;t--)
                {
                    a[pi]=a[pi]+(str1[t]-'0');
                    pi++;
                }
            }
            else if(k>=0)
            {
                for(t=k;t>=0;t--)
                {
                    a[pi]=a[pi]+str2[t]-'0';
                    pi++;
                }
            }
            else if(a[pi]!=0)//对于位数相同2个数加后最高位大于10的
                pi++;
            for(t=pi-1;t>=0;t--)
            {
                if(a[t]==0&&flag==0)//处理一次啊前导0,估计属于无用的一步
                    continue;
                else
                {
                    flag=1;
                    printf("%d",a[t]);
                }
               
            }
            printf("
    ");
            if(i!=n)//对于2组之间加空行的情况
                printf("
    ");
        }
        return 0;   
    }


    运行结果居然是这样的:我也是想不明白啊


    下面是我在大牛的基础上改的代码:虽然觉得还是有问题,但是AC了

    #include <stdio.h>
    #include <string.h>
    int main()
    {
    int T,z,t,i,j,len1,len2,sum;
    char a[1000],b[1000];
    scanf("%d",&T);
    for(z=1;z<=T;z++)
    {
    int c[1000]={0};
    scanf("%s",a);
    scanf("%s",b);
    printf("Case %d:
    ",z);
    printf("%s + %s = ",a,b);
    len1=strlen(a);
    len2=strlen(b);
    i=len1-1;
    j=len2-1;
    
    
    t=0;
    
    while(i>=0 && j>=0)     //输入的两个数相等长度的时候
    {
    if((c[t]+a[i]-'0'+b[j]-'0')>=10)
    {
    c[t]=c[t]+a[i]-'0'+b[j]-'0'-10;
    c[t+1]++;
    }
    else
    c[t]=c[t]+a[i]-'0'+b[j]-'0';
    i--;
    j--;
    t++;
    }
    while(i>=0)    //输入的第一个数比第二个数长的时候
    {
    if(c[t]+a[i]-'0'>=10)
    {
    c[t]=c[t]+a[i]-'0'-10;
    c[t+1]++;
    }
    else
    c[t]=c[t]+a[i]-'0';
    i--;t++;
    }
    while (j>=0)  //输入的第二个数比第一个数长的时候
    {
    
    if(c[t]+b[j]-'0'>=10)
    {
    c[t]=c[t]+b[j]-'0'-10;
    c[t+1]++;
    }
    else
    c[t]=c[t]+b[j]-'0';
    j--;t++; 
    }
    
    /*if(c[t]>=10){
    c[t]=c[t]-10;
    c[t+1]++;
    }*/
    
    sum=0;
    if(c[t]!=0)
    for(i=t;i>=0;i--)
    printf("%d",c[i]);
    else
    {
    t--;
    for(i=t;i>=0;i--)
    printf("%d",c[i]);
    
    
    }
    
    
    printf("
    ");
    if(z!=T)
    printf("
    ");
    
    }
    
    return 0;
    }



  • 相关阅读:
    53. Maximum Subarray
    64. Minimum Path Sum
    28. Implement strStr()
    26. Remove Duplicates from Sorted Array
    21. Merge Two Sorted Lists
    14. Longest Common Prefix
    7. Reverse Integer
    412. Fizz Buzz
    linux_修改域名(centos)
    linux_redis常用数据类型操作
  • 原文地址:https://www.cnblogs.com/qie-wei/p/12094136.html
Copyright © 2011-2022 走看看