HDU 5832 A water problem (水题)

49 篇文章 0 订阅

A water problem

Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 97    Accepted Submission(s): 58



Problem Description
Two planets named Haha and Xixi in the universe and they were created with the universe beginning.

There is 73 days in Xixi a year and 137 days in Haha a year.

Now you know the days N after Big Bang, you need to answer whether it is the first day in a year about the two planets.
 

Input
There are several test cases(about 5 huge test cases).

For each test, we have a line with an only integer N(0N) , the length of N is up to 10000000 .
 

Output
For the i-th test case, output Case #i: , then output "YES" or "NO" for the answer.
 

Sample Input
  
  
10001 0 333
 

Sample Output
  
  
Case #1: YES Case #2: YES Case #3: NO
 

Author
UESTC
 

Source
 
真是被这个题目恶心到了,
其实也怪自己见识的太少,用了很长的时间的高精度,最后用高精度加法过了,最后一问同学,简直是个水题!
都说一下吧,哎~~~
因为是一个大数取模吗,既是73的倍数,又是137的倍数,所以73*137 = 10001,所以可以枚举每一个数字,边枚举边取模,这样还哪能用到高精度啊,,
就像转换成10进制一样v = (v * 10 + a ) % mod,这样如果最后v是0 就yes了,否则就no!
高精度思路:
可能是找的板子有问题,全部都是超时,爆内存,
转换一下,把10001  = 10000 + 1
这就相当于输入n ,找出一个k 满足 k*10000 + k = n,这就相当于两个错位加法运算,直接模拟加法就行了!

奇怪的是,JAVA交好像没有过的~全都是爆内存!

水题代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10000000 + 1;
const int mod = 10001;
char s[maxn];
int main(){
    int kase = 0;
    while(scanf("%s",s) == 1){
        int len = strlen(s);
        int v = 0;
        for (int i = 0; i < len; ++i){
            v = (v*10 + s[i]-48) % mod;
        }
        if (v == 0)printf("Case #%d: YES\n",++kase);
        else printf("Case #%d: NO\n",++kase);
    }
    return 0;
}
/*
55894144405555
*/




找抽代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10000000 + 1;
char s[maxn];
char a[maxn];
char b[maxn];
char ans[maxn];
int main(){
    int kase  = 0 ;
    while(scanf("%s",s+1) == 1){
        int len = strlen(s+1);
        if (len > 4){
            a[len] = s[len]-48;
            a[len-1] = s[len-1]-48;
            a[len-2] = s[len-2]-48;
            a[len-3] = s[len-3]-48;
            int flag = 0;
            for (int i = 1; i <= len-4; ++i){
                int shang = a[len-i+1];
                int xia = s[len-4-i+1]-48;
                if (xia >= flag + shang)a[len-4-i+1] = xia - shang - flag,flag = 0;
                else a[len-4-i+1] = xia+10-flag-shang,flag = 1;
            }
            a[len+1] = a[len+2] = a[len+3] = a[len+4] = 0;
            bool ok =true;
            int cnt = 0;
            for (int i = 1; i <= len; ++i)a[i] = a[i+4];
//            for (int i = 1; i <= len; ++i)printf("%d ",a[i]);
//            puts("");
//            for (int i = 1; i <= len; ++i)printf("%d ",a[i]);
//            puts("");
            b[1] = b[2] = b[3] = b[4] = 0;
            for (int i =5; i <= len; ++i)b[i] = a[i-4];
//            for (int i = 1; i <= len; ++i)printf("%d ",b[i]);
//            puts("");
            flag = 0;
            for (int i = len ;i >= 1; --i){
                int t = a[i] + b[i] + flag;
                if (t > 9)flag = 1,t %= 10;
                else flag = 0;
                ans[i] = t;

            }
//            for (int i = 1; i <= len ;++i)printf("%d ",ans[i]);
            for (int i = 1; i <= len; ++i){
                if (s[i]-48 != ans[i]){
                    ok = false;
                    break;
                }
            }

            if (ok)printf("Case #%d: YES\n",++kase);
            else printf("Case #%d: NO\n",++kase);
        }else {
            int v = 0 ;
            for (int i = 1; i <= len; ++i){
                v = v * 10 + s[i] - 48;
            }
            if (v % 10001 == 0)printf("Case #%d: YES\n",++kase);
            else printf("Case #%d: NO\n",++kase);

        }



    }
    return 0;
}
/*
55894144405555
*/


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值