拨算盘

拨算盘
Description
对数字敏感的豆豆顺利进入了学校的珠算兴趣小组,老师送了他们每人一个算盘,但好玩的算盘并不是那么容易上手的,有很多小朋友因为嫌累纷纷退出了该兴趣小组,豆豆觉得 人都走光了就太冷清了,于是决定说服小朋友们留下来,他把加法算式所需要的拨动次数算 了出来,发现其实拨动次数没有想象的那么多。现在给你一系列加数(正整数),请计算使用算盘求解时需要拨动几次,(算盘图如下, 当前表示 67)。

    算盘被中间的横档分为上下半区,上方只有 1 颗表示该位上的 5,靠近中间的横档就计 数 5,只要拨动它就累计一次拨动,下方的四颗每颗表示 1,靠近横档就计相应个数的 1, 下方需要拨动多颗可以合并为一次拨动。

    注意:珠算里面的手法习惯是高位先算(这迎合了我们读数字的习惯) 例如 37+31,拨动方法如下图:

所以37+31总共需要拨动6次。

Input
第一行一个整数 N(1<=N<=10000), 表示加数的个数。

接下来N行,每行一个正整数,表示加数Ai(1<=Ai<2^31)。

Output
一个整数表示需要的拨动次数(假设算盘的位数足够多)。

Sample Input
2
853
947
Sample Output
11
Hint
30%的数据保证每个加数是100以内的,N<=10。

60%的数据保证加数和小于2^31, N<=100。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 21
int he[N],js[N];
int yw(int x,int y);
int main()
{
    int n,i,j,k,ans,x,x1,x2,ws;
    long long temp;
    bool bj;
    scanf("%d",&n);
    ans=0;
    for(i=1;i<=n;i++)
    {
        scanf("%d",&x);
        temp=x;
        ws=0;
        while(temp!=0)
        {
            js[++ws]=temp%10;
            temp/=10;
        }
        for(j=ws;j>=1;j--)
        {
            x1=he[j]+js[j];
            if(x1>=10)
            {
                x1-=10;
                bj=true;
                k=j+1;
                while(bj)
                {
                    x2=he[k]+1;
                    if(x2>=10)
                    {
                        x2-=10;
                    }
                    else
                    {
                        bj=false;
                    }
                    ans+=yw(he[k],x2);
                    he[k]=x2;
                    k++;
                }
            }
            ans+=yw(he[j],x1);
            he[j]=x1;
        }
    }
    printf("%d\n",ans);
    return 0;
}
int yw(int x,int y)
{
    int z;
    if((x<=4&&y<=4)||(x>4&&y>4))
    {
        return x!=y?1:0;
    }
    if(x>y)
    {
        swap(x,y);
    }
    z=1;
    z+=(x!=(y-5)?1:0);
    return z;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值