前言
本来很简单一个题被我用复杂的方法做了浪费了太多时间
题目描述:
定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。
例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。
输入:
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1≤n≤10100),表示待判断的正整数。n=0表示输入结束,你的程序不应当处理这一行。
输出:
对于每组测试数据,输出一行,表示相应的n是否是17的倍数。1表示是,0表示否。
思路:
其实就是一个简单的高精除,根本用不到定理,但是我一开始费了好的力去模拟定理,虽然最后过了,但是浪费了太多时间:
高精除代码:
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; typedef long long ll; const ll maxx = 1e18; const int N = 1e6+100; const int p = 1e4; const double eps = 1e-8; string s; int len,k; int main() { while(cin>>s) { if(s=="0") return 0; len=s.size();k=0;//注意每组数据把 k 清零 for(int i=0;i<len;i++) { k=k*10+(s[i]-'0'); if(k>=17) k%=17; }//模拟高精除 if(k==0) cout<<"1"<<endl; else cout<<"0"<<endl;//判断余数 } }
这里也给出我花了半小时敲出来的模拟代码:
思路:
两部分 1.尾数×5 为 s1串 2. 给出数数减去位数 为 s2串
如果 s1 >= s2
把这两个串变成数然后相减取绝对值
如果 s1 < s2
先模拟高精减,然后模拟高精除
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; typedef long long ll; const ll maxx = 1e18; const int N = 1e6+100; const int p = 1e4; const double eps = 1e-8; string s; int a[110]; int b[3]; int len,k; int main() { while(cin>>s) { if(s=="0") return 0; len=s.size(); for(int i=1;i<len;i++) a[i]=s[len-i-1]-'0';// s1部分读到 a数组里 // for(int i=len-1;i>=1;i--) cout<<a[i]; // cout<<endl;//debug int k=(s[len-1]-'0')*5; // cout<<k; int ii=1; while(k) { b[ii]=k%10; k/=10; ii++; } ii--;// s2部分读到 b 数组里 // for(int i=len-1;i>=1;i--) cout<<a[i];//debug if(len-1>ii)//情况二 { int m=1,n=1;//m小 n大 while(m<=ii&&n<=len-1) { if(a[n]<b[m]) { a[n]=a[n]+10-b[m]; int k=n; while(a[k+1]==0) { k++; } // cout<<k+1<<endl; a[k+1]--; } else a[n]=a[n]-b[m]; m++;n++; }//高精减 ; // for(int i=len-1;i>=1;i--) cout<<a[i]; // cout<<endl; //debug int kks=0; for(int i=len-1;i>=1;i--) { kks=kks*10+a[i]; if(kks>=17) kks%=17; }//高精除 if(kks==0) cout<<"1"<<endl; else cout<<"0"<<endl;//看余数 } else if(len-1<=ii)//情况一 { ll ks=0; for(int i=0;i<len-1;i++) { ks=ks*10+s[i]-'0'; } ll kk=(s[len-1]-'0')*5; if((kk-ks)%17==0) cout<<"1"<<endl; else cout<<"0"<<endl; } } }
总结:
认真读题思考很重要,不要被题带偏了。