UVa 11344 The Huge One (模性质)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2319

简单点的方法:由于a*10%m=((a%m)*10)%m,所以一个数一个数挨个取模判断即可。


复杂点的方法:

1. 1不用判断。

2. 若一个整数的未尾三位数能被8整除,则这个数能被8整除。

若一个整数的末尾两位数能被4整除,则这个数能被4整除。 

若一个整数的个位能被2整除,则这个数能被2整除。

3. 若一个整数的数字和能被9整除,则这个整数能被9整除。 

若一个整数的数字和能被3整除,则这个整数能被3整除。

4. 若一个整数能被2和3整除,则这个数能被6整除。

若一个整数能被3和4整除,则这个数能被12整除。 

5. 若一个整数的末位是0,则这个数能被10整除。

若一个整数的末位是0或5,则这个数能被5整除。

6. 判定被7、11整除的简易方法(但此方法还不如上面的取模快)

7. 简化判断次数:

若8ok,则4,2ok;

若9ok,则3ok;

若2,3ok,则6ok;

若3,4ok,则12ok;

若10ok,则5ok。


完整代码:

/*0.022s*/

#include<cstdio>
#include<cstring>

char s[1005];
int a[15];

int main()
{
	int t, len, n, i, j, rem;
	bool f;
	scanf("%d", &t);
	while (t--)
	{
	    getchar();
		gets(s);
		len = strlen(s);
		scanf("%d", &n);
		for (i = 0; i < n; ++i)
			scanf("%d", &a[i]);
		f = false;
		for (i = 0; i < n; ++i)
		{
			rem = 0;///remainder
			for (j = 0; j < len; ++j)
				rem = (rem * 10 + (s[j] & 15)) % a[i];
			if (rem)
			{
				f = true;
				break;
			}
		}
		if (f) printf("%s - Simple.\n", s);
		else printf("%s - Wonderful.\n", s);
	}
	return 0;
}

你可能感兴趣的:(C++,ACM,uva)