首页 > 代码库 > nyoj1086是否被整除(数学小技巧)
nyoj1086是否被整除(数学小技巧)
是否被整除
时间限制:1000 ms | 内存限制:65535 KB
难度:2
- 描述
- 一个位数不大于100万位的正整数,如果它既能被11整除又能被2的n次方整除就输出YES否则输出NO
- 输入
- 输入有多组数据每组数据有两行
第一行一个n代表2的n次方(0<n<18)
第二行一个整数 - 输出
- 输出只有一行每行一个YES或NO
- 样例输入
1 110 2 1100 3 110
- 样例输出
YES YES NO
- 来源
- 原创
- 上传者
TC_蒋鑫博
思路:能被2的N次方的数整除的数的特征
如果一个数末N位能被2的N次方的数整除,那么这个数就能被2的N次方的这个数整除。
如能被8(2的3次方)整除的数的特征:这个数字的末三位能被8整除。
能被11整除的数的特征
把一个数由右边向左边数,将奇位上的数字与偶位上的数字分别加起来,再求它们的差,如果这个差是11的倍数(包括0),那么,原来这个数就一定能被11除.
例如:判断491678能不能被11整除. —→奇位数字的和9+6+8=23
—→偶位数位的和4+1+7=12
23-12=11 因此,491678能被11整除. 这种方法叫"奇偶位差法".#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> using namespace std; int a[22]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576}; int main() { int n; char s[1000005]; char ss[1000005]; while(cin>>n>>s) { int l=strlen(s); int k=0; for(int i=l-n;i<l;i++) { ss[k++]=s[i]; } long long num=0; for(int i=0;i<k;i++) { num=num*10+(ss[i]-'0'); } int sumj=0; int sumo=0; for(int i=0;i<l;i++) { if(i%2==0) sumo+=s[i]-'0'; else sumj+=s[i]-'0'; } int sum=sumj-sumo; if(sum%11==0&&num%a[n]==0) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } /* 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576*/
nyoj1086是否被整除(数学小技巧)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。