HDU 5373 The shortest problem(判断一个数能否被11整除)

来源:互联网 发布:网络劫持修复工具 编辑:程序博客网 时间:2024/03/29 14:40

题目地址;点击打开链接

思路:参考队友的代码写的,资料地址:点击打开链接

 
怎样判断一个数能不能被11整除?

  判断一个数能不能被11整除与判断一个数能不能被7整除一样,都没有直接判断的方法,需要借助间接的方法,这种间接的方法有两种,其一是“割减法”,其二是奇偶位差法。

  (1)割减法:判断被11整除的割减法与判断被7整除的割减法不同。即:一个数割去末尾数字,再从留下来的数中减去这个末位数字,这样一次一次地减下去,如果最后结果是11的倍数(包括得0),那么这个数就能被11整除;如果最后结果不是11的倍数,那么这个数就不能被11整除。

  例如:4708……割去末位8

                                   

  因此,4708能被11整除。

  在判断时,对于数目不大的数,用口算就可以看出结果。

  通过口算可以得出:891能被11整除;1007不能被11整除。

  (2)奇偶位差法:把一个数由右边向左边数,将奇位上的数字与偶位上的数字分别加起来,再求它们的差,如果这个差是11的倍数(包括0),那么原来这个数就一定能被11整除。

  例如①:判断283679能不能被11整除。

  23-12=11

  因此,283679能被11整除。

  ②判断480637能不能被11整除。

 

 21-7=14

  因此,480637不能被11整除。

  上述这种方法叫做奇偶位差法,算理可通过下列算式说明。

  9÷9=1 9÷11(不能整除)

  99÷9=11 99÷11=9

  999÷9=111 99÷11(不能整除)

  9999÷9=1111 9999÷11=909

  99999÷9=11111 9999÷11(不能整除)

  999999÷9=111111 999999÷11=90909

  …… ……

  由以上两算式中可以看到:全部由9组成的任何一个数,都能被9整除,但除以11则不一定,只有当9的个数成偶数时,才能被11整除,当9的个数是奇数时,则不能被11整除。

  当一个数首尾数字相同,中间都是0,而且0的个数成偶数时,这个数也能被11整除。

  如:11÷11=1

  1001÷11=91

  300003÷11=27273

  ……

  通过用奇偶位差法的分解来判断8712能不能被11整除,从中也可以进一步理解这种判断方法的算理。

  8712=8000+700+10+2 ①

  偶 奇 偶 奇

  偶位上的数可以写成:

  8000=8×1000=8×(1001-1) ②

  10=1×10=1×(11-1) ③

  奇位上的数可以写成:

  700=7×100=7×(99+1) ④

  把②③④式代到①式中去。

  第一个括号中所得的结果,肯定能被11整除,原数能不能被11整除,决定于第二个括号中所得的数,而第二个括号中的数,恰恰是奇位数字与偶位数字之差,由此而得出了用奇偶位差法来判断一个数能不能被11整除。

AC代码:

#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>using namespace std;char a[1000000];int main(){    int n,t,sum1,sum,l,i;    int sum_ji,sum_ou,casei = 1,begin1;    while(scanf("%d%d",&n,&t))    {        sum_ji = 0;        sum_ou = 0;        sum1 = 0;        l = 0;        if(n == -1 && t == -1)            break;        while(n)        {            a[l++] = n % 10 + '0';            sum1 += n % 10;            n /= 10;        }        reverse(a,a+l);        sum = sum1;        while(t--)        {            begin1 = l;            while(sum1)            {                a[l++] = sum1 % 10 + '0';                sum += sum1 % 10;                sum1 /= 10;            }            reverse(a+begin1,a+l);//转换的是从begin1到l-1的位置,也就是说第一个参数是转换开始的位置,第二个参数是转换结束的下一个位置            sum1 = sum;        }        for(i=0; i<l; i++)        {            //printf("  %c",a[i]);            if(i % 2 == 0)                sum_ji += a[i] - '0';            else                sum_ou += a[i] - '0';        }        //printf("\n");        printf("Case #%d:",casei++);        l = abs(sum_ji - sum_ou);        if(l % 11 == 0)            printf(" Yes\n");//注意输出,前面有一个空格,大小写都有        else            printf(" No\n");    }    return 0;}


0 0
原创粉丝点击