SDUT 3260 第六届山东省ACM省赛 Single Round Math(数字特征) C语言23行代码搞定~

传送门:SDUT 3260



题目大意:

给你两个最多 1000 位的十进制数,问它们是否相等并且是 11 的倍数。



思路:

方法1:用 java 或 python 的大数来一发。


方法2:

利用数字倍数的特征,如果一个数是11 的倍数,则其奇数位数之和与偶数位数之和的差能被11整除。



顺便给大家附上之前整理的其他数字倍数的特征:


3的倍数的特征:各位数相加是3的倍数

9的倍数的特征:各位数相加是9的倍数

7的倍数的特征:若一个整数的个位数字截去,再从余下的数中,减去个位数的2倍,如果差是7的倍数,则原数能被7整除。如果差太大或心算不易看出是否7的倍数,就需要继续上述「截尾、倍大、相减、验差」的过程,直到能清楚判断为止。例如判断6139是否7的倍数的过程如下:613-9×2=595 , 59-5×2=49,所以6139是7的倍数

11的倍数的特征:奇数位数之和与偶数位数之和的差能被11整除则是11的倍数

4的倍数的特征:一个数的末两位数是4的倍数,那么这个数就是4的倍数

8的倍数的特征:一个数的末三位数是8的倍数,那么这个数就是8的倍数



代码:

#include<stdio.h>
#include<string.h>
int main()
{
	int i,t,n,m,f,len;
	char a[1010],b[1010];
	scanf("%d",&t);
	while(t--)
	{		
		scanf("%s%s",a,b);
		f=1;
		if(strcmp(a,b)!=0) f=0; //判断两个数是否相等 
		len=strlen(a);
		n=m=0;
		for(i=0;i<len;i++)
			if(i%2) n+=a[i]-'0'; //奇数位之和 
			else m+=a[i]-'0'; //偶数位之和 
		if((n-m)%11!=0) f=0; //判断是否是11的倍数 
		if(f) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zuzhiang/article/details/80075654