HDU 5373 The shortest problem(这题算模拟吧)

The shortest problem

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0


Problem Description
  
  
In this problem, we should solve an interesting game. At first, we have an integer n, then we begin to make some funny change. We sum up every digit of the n, then insert it to the tail of the number n, then let the new number be the interesting number n. repeat it for t times. When n=123 and t=3 then we can get 123->1236->123612->12361215.
 

Input
  
  
Multiple input. We have two integer n (0<=n<= 104 ) , t(0<=t<= 105 ) in each row. When n==-1 and t==-1 mean the end of input.
 

Output
  
  
For each input , if the final number are divisible by 11, output “Yes”, else output ”No”. without quote.
 

Sample Input
  
  
35 2 35 1 -1 -1
 

Sample Output
  
  
Case #1: Yes Case #2: No
 
/*********************************************************************/

题意:给你一个数n和操作次数t,每次操作将n的各位数之和求出来放在n的末尾形成新的n,问t次操作后得到的n是否可以被11整除。蓝色部分如果不理解,可以举个例子,如题中提到的n=123,第一次操作求得的各位之和为1+2+3=6,放在n的末尾形成新的n=1236;第二次操作各位之和为1+2+3+6=12,形成新的n为123612;以此类推。

首先,有一点要清楚的是,怎么样的数能被11整除,原先知道也好,百度过也好,你会知道,当一个数的奇数位之和与偶数位之和的差的绝对值能被11整除,那么该数就可以被11整除。如35816,奇数位之和为17,偶数位之和是6,差的绝对值为11,所以能被11整除。

既然知道了这一点,那就可以直接做了,每次操作,只要+奇数位,-偶数位,那么最终结果求一下绝对值再看能不能被11整除就行了。

这题总体来说还是比较简单的,刚开始想到没敢写,毕竟总觉得会超时,如此暴力,结果就A了,好吧,是我想太多

上代码,有问题欢迎留下评论,我会尽快回复

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<stdlib.h>
#include<cmath>
#include<string>
#include<algorithm>
#include<iostream>
#define exp 1e-10
using namespace std;
const int N = 20;
const int inf = 1000000000;
int s[N],k;
__int64 Abs(__int64 x)
{
    return x<0?-x:x;
}
__int64 fun(__int64 x)
{
    __int64 tem=0;
    while(x)
    {
        s[k++]=x%10;
        tem+=x%10;
        x/=10;
    }
    return tem;
}
int main()
{
    __int64 n,m,ans,tem;
    int t,v,j=1;
    while(scanf("%I64d%d",&n,&t)&&(n!=-1||t!=-1))
    {
        ans=k=0;
        v=1;m=fun(n);
        while(k--)
            if(v)
                ans+=s[k],v=0;
            else
                ans-=s[k],v=1;
        while(t--)
        {
            k=0;
            m+=fun(m);
            while(k--)
                if(v)
                    ans+=s[k],v=0;
                else
                    ans-=s[k],v=1;
        }
        printf("Case #%d: ",j++);
        if(Abs(ans)%11)
            puts("No");
        else
            puts("Yes");
    }
}
菜鸟成长记


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值