您的位置:首页 > 其它

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

2015-08-13 09:47 441 查看
题目地址;点击打开链接

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

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

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

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

  例如:4708……割去末位8

[align=center][/align]

                                   


  因此,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) ④

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

[align=center][/align]



  第一个括号中所得的结果,肯定能被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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: