http://pat.zju.edu.cn/contests/pat-a-practise/1023
输入:1234567899
输出 :Yes
2469135798
给出一个大数(a),看它的2倍(b)是否符合以下规则:
如a中9出现两次,那么b中9也只能出现两次,但可以在不同的位置上
sign的使用意义:
例:1234 与 4231
从低位往高位累加,sign1=2^4+2^3+2^2+2^1 sign2=2^1+2^3+2^2+2^4
这样判定,两个数的所有位是否相同(即使相同数字不在相同的位上)
例:6123457891 *2 ====12.........有进位,原str保存不下
进位保存在carry,单独输出,再输出str
//以下为代码:
#include <stdio.h>
#include <string.h>
int add(int n) //返回2^n
{
return 1<<n; //左移1位相当于*2
}
void cmp(char str[])
{
int len=strlen(str);
int tmp;
int sign1=0,sign2=0;
int carry=0;
while (len--)
{
sign1+=add(str[len]-'0');
tmp = ( str[len]-'0' ) * 2;
str[len]='0'+(tmp%10)+carry; //转化为字符形式
sign2+=add(str[len]-'0');
carry=tmp/10;
}
if (sign1==sign2)
{
printf("Yes\n");
}
else
printf("No\n");
if (carry==0)
{
printf("%s",str);
}
else
printf("%d%s\n",carry,str);
}
int main()
{
char str[25]; //保存输入数值字符串,不超过20位
scanf("%s",str);
cmp(str);
return 0;
}