C语言网1074数字整除

题目描述

定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。

例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。

输入格式

输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=10^100),表示待判断的正整数。n=0表示输入结束,你的程序不应当处理这一行。

输出格式

对于每组测试数据,输出一行,表示相应的n是否是17的倍数。1表示是,0表示否。

样例输入

复制

34
201
2098765413
1717171717171717171717171717171717171717171717171718
0

样例输出

复制

1
0
1
0

对于这道题,数据的最大范围是pow(10,100),显然不能使用类型来直接处理数字,在这种情况下,要存放下这么长的数字,并且还要对其进行指定位的操作,就想到了将它放在字符数组里。

#include<stdio.h>
#include<string.h>

int IsMul(char* ch, int len) {
    int n = 0;
    int digit = 0;
    if (len == 2) {//两位数直接转化成整型判断是否能整除17
        n = 10 * (ch[0] - 48) + (ch[1] - 48);
        if (n % 17 == 0)
            return 1;
        else
            return 0;
    }
    else if (len == 3) {//三位数使用题干给出的方法
        digit = ch[2] - 48;//得到个位数
        n = 10 * (ch[0] - 48) + (ch[1] - 48);//去掉个位数剩下的数字
        n = n - 5 * digit;//余下的数减去个位数的五倍
        if (n % 17 == 0)//判断
            return 1;
        else
            return 0;
    }
    else {//四位数及以上
        digit = ch[len - 1];//得到个位数
        //由于个位数的五倍最大为45,而余下数的后两位可能不够减,所以直接取出最后三位数
        n = (ch[len - 4] - 48) * 100 + (ch[len - 3] - 48) * 10 + (ch[len - 2] - 48);
        n = n - 5 * digit;//用余下数的最后三位减去个位数的5倍
        ch[len - 1] = '\0';//将最后一位置为0

        //将相减之后的数重新输入字符数组
        ch[len - 2] = n % 10 + 48;
        n /= 10;
        ch[len - 3] = n % 10 + 48;
        n /= 10;
        ch[len - 4] = n + 48;

        IsMul(ch, strlen(ch));//判断相减之后的数是否是17的倍数
    }
}

int main()
{
    char ch[102] = { 0 };//由于题目所给的数字范围最大是pow(10,1000)
    //对于这么大的数字,任何类型都是无法处理的,但题目中给出了判断
    //是否是倍数的方法,这种按位处理的方式再加上超长的数字就给了用
    //字符串来读取数字的灵感
    while (scanf("%s", ch)) {//读取一个数字
        if (ch[0] == '0')//读到0就停止
            break;
        if (ch[1] == '\0')//一位数直接排除
            continue;
        if (IsMul(ch, strlen(ch)))//两位数以上进入函数判断
            printf("1\n");
        else
            printf("0\n");
    }
    return 0;
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值