Cutting an integer means to cut a K digits lone integer Z into two integers of (K/2) digits long integers A and B. For example, after cutting Z = 167334, we have A = 167 and B = 334. It is interesting to see that Z can be devided by the product of A and B, as 167334 / (167 × 334) = 3. Given an integer Z, you are supposed to test if it is such an integer.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤ 20). Then N lines follow, each gives an integer Z (10 ≤ Z <231). It is guaranteed that the number of digits of Z is an even number.
Output Specification:
For each case, print a single line Yes if it is such a number, or No if not.
Sample Input:
3
167334
2333
12345678
Sample Output:
Yes
No
No
题目大意:给定一个数x,其位数wei必定是偶数。将这个数按wei/2对半分,左边为a,右边为b。如果x%(a*b)==0,输出Yes,否则输出No。
注意:有可能会分出为0的情况,而除0或者模0都是没有意义的,所以要特判一下。
代码如下:
/* 常规解法 */
#include <stdio.h>
int main()
{
int n, x, i;
scanf("%d", &n);
while(n--)
{
scanf("%d", &x);
int y = x;
int wei = 0;
while(y != 0)
{
wei++;
y /= 10;
}
int ten = 1;
for(i=1; i<=wei/2; i++) ten *= 10;
int a = x/ten;
int b = x%ten;
if(a*b != 0 && x%(a*b) == 0) printf("Yes\n");
else printf("No\n");
}
return 0;
}
/* 另解:用字符串输入,然后分成两个字串,最后用atoi函数判断 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int n;
char s[15];
scanf("%d", &n);
while(n--)
{
scanf("%s", s);
int len = strlen(s), i;
char s1[15], s2[15];
for(i=0; i<len/2; i++)
s1[i] = s[i];
s1[i] = '\0';
for(i=len/2; i<len; i++)
s2[i-len/2] = s[i];
s2[i-len/2] = '\0';
int x = atoi(s);
int a = atoi(s1);
int b = atoi(s2);
if(a*b != 0 && x%(a*b) == 0) printf("Yes\n");
else printf("No\n");
}
return 0;
}
总结
- 浮点错误:可能出现了除0或者模0的情况,要特判。
- atoi(a)可以将字符串从下标为a开始到’\0’的字串变成数字。(前提是字符串得是数字)