题解思路
- 首先,拿到一道题目必须必须关注输入变量的范围!!! 比如1≤n≤10^100!!!
- 所以,这道题每次输入的正整数,如果用数字类型的变量储存,int和long long都会爆!!!
- 那么,我们就要尝试更换思路,对于这类 “大数”问题,通常会把它们看做字符串来储存
- 现在,问题就转化为,如何判断一个字符串表示的正整数能否被17整除,还不能爆int/long long
- 对于这个问题,我们可以准备一个初值为0的变量ans,然后遍历字符串
- 从高位开始,取出字符串的每一位(从左往右)
- 变量ans每次*10,再加上取出的那一位的ASCII码,然后勿忘-48,因为字符0的ASCII码是48
- 然后非常关键的是!!!每取一位累计ans后,都要对17做一次取余,以 防ans爆 int/long long
- 这是因为a%b=c,则 (ad)%b=cd,故多次取余和最后取余,对判断是否能被17整除效果一致
- 最后ans如果为0,则代表原输入可以被17整除,输出1;反之,输出0;
- 还要注意判断输入0即为结束,由于输入的是字符串,所以在while循环内应以put[0]!=48作为条件
- 希望大家通过这道题目,能够初步掌握对大数的处理方法,祝大家AC愉快鸭٩(๑>◡<๑)۶
AC代码
#include<stdio.h>
#include<string.h>
int main()
{
int ans;
char put[200];
while(~scanf("%s",&put)&&put[0]!=48)
{
if(strlen(put)==1&&put[strlen(put)-1]=='0') break;
ans=0;
for(int i=0;i<strlen(put);++i) ans=(ans*10+put[i]-48)%17;
printf("%d\n",ans==0?1:0);
}
return 0;
}