1023. Have Fun with Numbers

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;
}
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值