HZNUOJ-1072-数字整除题解

HZNUOJ-1072-数字整除

在这里插入图片描述

题解思路

  • 首先,拿到一道题目必须必须关注输入变量的范围!!! 比如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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值