山科OJ(计科作业8):Problem I: 小学生算术

先看题目:

题目叫“小学生算术”,哈哈哈,一看题目感觉大学生不会做小学生的算术了(开个玩笑)。

这题给我的第一印象是用字符串解决,因为想了一下如果直接用整数来解决这个题目的话特别麻烦(其中包括不断取余得到每个位置上的数字,还涉及了一系列无法描述的操作,总之很难实现) 。

下面是AC代码及注释:

#include<stdio.h>
#include<string.h>
int main()
{
    char a[50000],b[50000];
    while (scanf("%s%s",a,b)!=EOF)
    {
        int lena=strlen(a),lenb=strlen(b);
        int min,max;
        if (lena<=lenb)  //比较两个字符串的长度,方便后续的操作
        {
            min=lena;
            max=lenb;
        }

        else
        {
            min=lenb;
            max=lena;
        }
        int cnt=0,t=0,i=min-1,j=max-1; //cnt记录进位次数,t表示上一次两个数相加是否进位,若进位,则t=1,此次计算除两数相加外还要加1,若未进位,t=0
        if (min==lena)  //还需要注意的是是从数组最后一个元素开始相加,而不是从第一个元素开始
        {
            for ( i; i>=0; i--)
            {
                for (j; j>=0; )
                {
                    if (t==0)
                    {
                        if (a[i]-48+(b[j]-48)>'9'-48)  //将数字转换成ASCII值的0-9(比如1的ASCII为49,将其转换为ASCII为1),若两个相加大于9,则进位,下面的操作类似
                        {
                            cnt++;
                            t=1;
                        }
                    }
                    else if(t==1)
                    {
                        if (a[i]-48+(b[j]-48)+'1'-48>'9'-48)
                        {
                            cnt++;
                            t=1;
                        }
                        else t=0;
                    }
                    j--;
                    break;  //因为每次只加一个数,因此在执行完一次循环后需要跳出内层循环继续下一次的大循环
                }


            }
        }
        else
        {
            for ( i; i>=0; i--)
            {
                for (j; j>=0; j--)
                {
                    if (t==0)
                    {
                        if (a[j]-48+(b[i]-48)>'9'-48)
                        {
                            cnt++;
                            t=1;
                        }
                    }
                    else if(t==1)
                    {
                        if (a[j]-48+(b[i]-48)+'1'-48>'9'-48)
                        {
                            cnt++;
                            t=1;
                        }
                        else t=0;
                    }
                    j--;
                    break;
                }


            }
        }
        if (t==1)  
        {
            if (max==lena)
            {
                for (j; j>=0&&t==1; j--)  //若两个字符串长度不相等且t=1的话较长的字符串还需要进行加法,然后判断是否还需要进位
                {
                    if (a[j]-48+('1'-48)>'9'-48)
                    {
                        cnt++;
                        t=1;
                    }
                    else t=0;
                }
            }
            else if (max==lenb)
            {
                for (j; j>=0&&t==1; j--)
                {
                    if (b[j]-48+('1'-48)>'9'-48)
                    {
                        cnt++;
                        t=1;
                    }
                    else t=0;
                }
            }

        }
        printf("%d\n",cnt);
    }
}

第二次做后优化了一下代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char a[100];
    char b[100];
    while (scanf("%s",a)!=EOF)
    {
        scanf("%s",b);
        int len1=strlen(a);
        int len2=strlen(b);
        int cnt=0;
        int j=len2-1;
        int i=len1-1;
        int len;
        if (len1>len2)
            len=len1;
        else len=len2;
        while (j>=0||i>=0)
        {
            if (i<0)
            {
                if (b[j]-'0'>9)
                {
                    cnt++;
                    b[j-1]+=1;
                }
            }
            else if (j<0)
            {
                if (a[i]-'0'>9)
                {
                    cnt++;
                    a[i-1]+=1;
                }
            }
            else
            {
                if (a[i]+b[j]-'0'-'0'>9)
                {
                    cnt++;
                    if (len==len1)
                        a[i-1]+=1;
                    else if(len==len2)
                        b[j-1]+=1;
                }
            }

            i--;
            j--;
        }
        printf("%d\n",cnt);
    }
}


如果有不同的意见或建议欢迎大家在评论区提出!

继续加油!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值