hdu5832 A water problem (大数求余):http://acm.hdu.edu.cn/showproblem.php?pid=5832
题目描述:
合训练的同学们~
题目大意:
输入一个数n,n为一个大数,若n既是73的倍数又是137的倍数,则输出YES,否则输出NO。
题目分析:
由于73和137都是质数,所以,若n为73*137的倍数,则输出YES,否则输出NO。但是由于n为大数,10的7次方以内的数,则直接开10的7次方的char数组进行输入,还要把char数组中的内容对应到int数组中,会内存超限,同样用java语言交的话,也会内存超限,为了不超限,有两种处理的方法。
代码实现一:
#include <cstdio> #include <cstring> const int N=1000010; typedef long long LL ; LL a[N]={0}; char a1[N*10]; int main() { int i,j,k; LL d,b; int T=0; while(scanf("%s",a1)!=-1) { T++; //if (strcmp(a1,"0")==0) {printf("Case #%d: YES\n",T);continue;} d=0; k=strlen(a1); //printf("kkk%d\n",k); for(i=0,j=0; i<k; j++) { if (i+10<=k) { a[j]=(LL)(a1[k-i-1]-'0')+(LL)(a1[k-i-2]-'0')*10+((LL)a1[k-i-3]-'0')*100+(LL)(a1[k-i-4]-'0')*1000+(LL)(a1[k-i-5]-'0')*10000+(LL)(a1[k-i-6]-'0')*100000+(LL)(a1[k-i-7]-'0')*1000000+(LL)(a1[k-i-8]-'0')*10000000+(LL)(a1[k-i-9]-'0')*100000000+(LL)(a1[k-i-10]-'0')*1000000000; i+=10; } else if (i+10>k && i+9<=k) { a[j]=(LL)(a1[k-i-1]-'0')+(LL)(a1[k-i-2]-'0')*10+(LL)(a1[k-i-3]-'0')*100+(LL)(a1[k-i-4]-'0')*1000+(LL)(a1[k-i-5]-'0')*10000+(LL)(a1[k-i-6]-'0')*100000+(LL)(a1[k-i-7]-'0')*1000000+(LL)(a1[k-i-8]-'0')*10000000+(LL)(a1[k-i-9]-'0')*100000000; i+=9; } else if (i+9>k && i+8<=k) { a[j]=(LL)(a1[k-i-1]-'0')+(LL)(a1[k-i-2]-'0')*10+(LL)(a1[k-i-3]-'0')*100+(LL)(a1[k-i-4]-'0')*1000+(LL)(a1[k-i-5]-'0')*10000+(LL)(a1[k-i-6]-'0')*100000+(LL)(a1[k-i-7]-'0')*1000000+(LL)(a1[k-i-8]-'0')*10000000; i+=8; } else if (i+8>k && i+7<=k) { a[j]=(LL)(a1[k-i-1]-'0')+(LL)(a1[k-i-2]-'0')*10+(LL)(a1[k-i-3]-'0')*100+(LL)(a1[k-i-4]-'0')*1000+(LL)(a1[k-i-5]-'0')*10000+(LL)(a1[k-i-6]-'0')*100000+(LL)(a1[k-i-7]-'0')*1000000; i+=7; } else if (i+7>k && i+6<=k) { a[j]=(LL)(a1[k-i-1]-'0')+(LL)(a1[k-i-2]-'0')*10+(LL)(a1[k-i-3]-'0')*100+(LL)(a1[k-i-4]-'0')*1000+(LL)(a1[k-i-5]-'0')*10000+(LL)(a1[k-i-6]-'0')*100000; i+=6; } else if (i+6>k && i+5<=k) { a[j]=(LL)(a1[k-i-1]-'0')+(LL)(a1[k-i-2]-'0')*10+(LL)(a1[k-i-3]-'0')*100+(LL)(a1[k-i-4]-'0')*1000+(LL)(a1[k-i-5]-'0')*10000; i+=5; } else if (i+5>k && i+4<=k) { a[j]=(LL)(a1[k-i-1]-'0')+(LL)(a1[k-i-2]-'0')*10+(LL)(a1[k-i-3]-'0')*100+(LL)(a1[k-i-4]-'0')*1000; i+=4; } else if (i+4>k && i+3<=k) { a[j]=(LL)(a1[k-i-1]-'0')+(LL)(a1[k-i-2]-'0')*10+(LL)(a1[k-i-3]-'0')*100; i+=3; } else if (i+3>k && i+2<=k) { a[j]=(LL)(a1[k-i-1]-'0')+(LL)(a1[k-i-2]-'0')*10; i+=2; } else if (i+2>k && i+1<=k) { a[j]=(LL)(a1[k-i-1]-'0'); i++; } } // for(int i=j-1; i>=0; i--) // { // printf("%I64d ",a[i]); // } // printf("\n"); for(i=j-1; i>=0; i--) { d=d*10000000000+a[i]; d=d%10001; } if (d==0) printf("Case #%d: YES\n",T); else printf("Case #%d: NO\n",T); } return 0; } 代码实现二:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int mod=10001; char str[10000100]; int main() { long long sum; int casenum=1; while(scanf("%s",str)!=EOF) { sum=0; int len=strlen(str); for(int i=0;i<len;i++) { sum=sum*10+(str[i]-'0'); sum=sum%mod; } if(sum==0) { printf("Case #%d: YES\n",casenum++); } else { printf("Case #%d: NO\n",casenum++); } } return 0; }