ct5_3: 恶魔数字7★题目描述:7是一个恶魔数字,如果一个数是7的倍数,或者它的数位上含有数字7,那么这个数也是恶魔数字输入:多组测试数据,每组只有一行,一行只有一个整数n(1<=n<=1e(1e5)),最后输入一个0来表示结束输出:判断这个数是不是恶魔数字,是的话输出yes,否则输出no样例输入:7171470940样例输出:yesyesyesyesno难度:very easy 我的代码: #include<iostream>using namespace std; int main(void){ long dn; do { int flag=0,k=10,temp=0; cin>>dn; if( dn>=1 && dn<=100000 ) { if(dn%7==0) flag=1; else { while(dn>=10) { temp=dn%k; dn/=k; if(temp==7) { flag=1; break; } } } if(flag==1) cout<<"yes"<<endl; else cout<<"no"<<endl; } }while(dn!=0); return 0;} G++: Compile OKTest 1: Time Limit Exceed--------------------------------Problem ID ct5_3Test Result Time Limit ExceedTime Limit 100 msTotal Memory 144 Kb / 1000 KbCode Length 432 Bytes #include <iostream>#include<cstdlib>using namespace std;int main(void){ char a[10],*p,*q; int aa=0;do{ int flag=0; cin>>a; p=a; while(*p=='0') p++; aa=strtol(p,&q,0); if(aa!=0) { if(aa%7==0) flag=1; while(*p!='\0') { if(*p=='7') {flag=1;break;} p++; } if(flag==1) cout<<"yes"<<endl; else cout<<"no"<<endl; }}while(aa!=0); return 0;} G++: Compile OKTest 1: Runtime Error--------------------------------Problem ID ct5_3Test Result Runtime ErrorTotal Time NULLTotal Memory 132 Kb / 1000 KbCode Length 413 Bytes 别人的: 基本算法:由于数据很大,所以用字符串读入,然后逐个扫描,看有没有7,如果有,就直接输出yes,如果没有再进一步判断这个巨数是不是可以被7整除。由于模运算支持加减乘除的分配率,所以我们模拟把一个字符串转化为一个数的过程,在中间的步骤上都加上模运算,就可以求得这个数对7的模,这个方法值得注意的是:输入的数据有的带前导零的状况,字符串读入后,不能通过只判断第一位是否为零来判断输入的数据是否为零。优化方法:1.由于扫描,取模,判断前导零都是逐个扫描输入的字符,所以我们可以变读入边进行以上的处理,这就不 需要开数组来保存读入的数据,如果出现7就不用处理后面的数字了,直接读掉,这样可以加快速度.2.去模比较慢,由于每次要去模的数据不大,所以我们用一个循环,每次去减7,直到小于7为止,这样可 以提高速度参考标程:#define PB_ID ct5_3 #include <stdio.h> int main(void) { int n; for(;;) { int sum = 0; int z = 0; while((n=getchar())!='\n') { if(n>'0') { z=1; if(n=='7') { sum = 0; while(getchar()!='\n'); break; } } sum = sum * 3 + n - '0'; while(sum>=7)sum -= 7; } if(z==0)break; if(sum==0) puts("yes"); else puts("no"); } return 0; }他人2:#define CP_GCC #include <stdio.h> #include <string.h> #define N 100000 char a[N]; int main() { int s, c; char* p; while(gets(a)) { if(!strcmp(a, "0")) break; if(strchr(a, '7')) { puts("yes"); continue; } s=0; p=a; while(*p=='0')++p; while(c=*p++) s=(3*s+c-48)%7; s?puts("no"):puts("yes"); } return 0; }

评论