Description:
There is a positive integer X, X's reversion count is Y. For example, X=123, Y=321; X=1234, Y=4321. Z=(X-Y)/9, Judge if Z is made up of only one number(0,1,2...9), like Z=11,Z=111,Z=222,don't consider '+'and '-'.
Input:
Input contains of several test cases. Each test case only contains of a number X, L is the length of X. ( 2 <= L < 100)
Output:
Output “YES”or “NO”.
样例输入
10 13
样例输出
YES YES
题目来源
题意:输入一个长度为 小于100的数,判断这个数和这个数的倒序被 9 整除后的数中 的数字是不是都相同;
思路:通常大家想法一定和我一样 把过程模拟一边就行了呗,但是这其中是有规律可询的,找到规律,你将受益无穷;
首先 一个数n与他反序数的差的绝对值,一定是9的倍数。证明如下:
设四位数 ABCD 他的反序数是DBCA
ABCD-DCBA=(1000*A+100*B+10*C+D)-(1000*D+100*C+10*B+A)
=(1000-1)*A+(100-10)*B-(100-10)*C-(1000-1)*D
=999*A+90*B-90*C-999*D
=(111*A+10*B-10*C-111*D)*9
再设五位数 ABCDE 他的反序数是 EDCBA
ABCDE-EDCBA=(10000*A+1000*B+100*C+10*D+E)-(10000*E+1000*D+100*C+10*B+A)
=9999*A+990*B+0*C-990*D-9999*E
=(1111*A+110*B-110*D-1111*E)*9
可以接着模拟 6位数;
最后两个数的差要是每一位都相等的话,那么 一定是 1,11, 111, 1111.......的倍数,四位时,(111A-111D)一定是 111的倍数,10B-10C = 10(B-C) 要是B-C不为0时,一定不会是 1, 11, 111, 1111......的倍数,当 位数为 偶数时, 只需判断 当位数为 奇数时,中间的哪一位的差值,是一定被消除了,只需除首末位 和 中间位外,对称位是否相等 就行了
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define Max 110
int main()
{
char str[Max],s[Max];
while(~scanf("%s",str))
{
int i,j;
int l = strlen(str);
int f = 1;
for(i = 0;i<l/2;i++)
{
if(i==0)
continue;
else
if(str[i]!=str[l-1-i])
f = 0;
}
if(f) printf("YES\n");
else printf("NO\n");
}
return 0;
}
模拟:代码二:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define Max 110
int a[Max],b[Max],c[Max];
int fff(int a[Max],int b[Max],int l)
{
int i,j;
for(i = l-1;i>=0;i--)
{
if(a[i]<b[i])
{
int k = i-1;
while(a[k]==0)
{
a[k] = 9;
k--;
}
a[k] = a[k] - 1;
a[i] = a[i] + 10;
c[i] = a[i] - b[i];
}
else
{
c[i] = a[i] - b[i];
}
}
i = 0;
while(c[i]==0&&i<l)
i++;
int sum = 0;
int f = 0,tmp;
while(i<l)
{
//printf("%d",c[i]);
sum = sum*10 + c[i];
int t = sum/9;
sum = sum%9;
if(t!=0&&!f)
{
tmp = t;
f = 1;
}
if(f)
{
if(t!=tmp)
return 0;
}
i++;
}
//printf()
return 1;
}
int main()
{
char str[Max],s[Max];
int i,j;
while(~scanf("%s",str))
{
int l = strlen(str);
for(i = 0;i<l;i++)
{
a[i] = str[i] - '0'; // 因为两个数的长度相同,相减时,可以不用倒着存;
b[l-1-i] = str[i]-'0';
s[l-1-i] = str[i];
}
s[l] = '\0';
if(strcmp(str,s)>=0)
{
if(fff(a,b,l))
printf("YES\n");
else printf("NO\n");
}
else
{
if(fff(b,a,l))
printf("YES\n");
else printf("NO\n");
}
}
return 0;
}