任务描述
(这是写头哥时遇到的,之前找遍csdn也没看到类似的,并且感觉这题很怪)
输入:有多组数据输入,数据组数不超过 100。每组数据一行是只包含 0 和 1 的字符串,长度为 w,代表一个补码表示的 w 位二进制数,首位是它的符号位。
输出:对于每一组数据,如果它的相反数可以被 w 位二进制补码数字表示出来,则输出一行字符串,表示输入二进制补码数字的相反数。要求不省略前导 0,输出的字符串长度和输入的相同,即 长度为 w。如果其相反数不能被 w 位二进制补码数字表示出来,请输出 0verf1ow
!
样例
这和一般的题目不一样,需要给所有的数字进行转换 0--->1 1---->0
(而正数的原码反码补码一样)但这里都要改
然后再加一,逢2进一(注意样例中输出的是0verf1ow!)
这里用的感觉是比较笨的办法,如果有其他的方法希望能指出,谢谢大佬了
代码
#include <stdio.h>
#include <string.h>
int main()
{
/**********Begin**********/
char a[20],b[20];int i=0,num=0,count=0;
while(scanf("%s",a)!=EOF)//输入多组数据,ctrl+z结束
{
num=strlen(a);//算输入二进制数的长度,注意这里输入的是字符串
for(i=0;i<num;i++)
{
a[i]=a[i]-'0';//字符串数组由字符型变为整形,方便后面计算
}
strcpy(b,a);//复制a给b数组,为了判断转化后a是否和原来的一样
for(i=0;i<num;i++)//对a数组里的数进行转换
{
if(a[i]==0)
{
a[i]=1;
continue;
}
else if(a[i]==1)
{
a[i]=0;
continue;
}
}
for(i=0;i<num;i++)//最后一个数+1,判断是否要进1,以此类推
{
int cnt=num-1;
while(cnt!=-1)
{
a[cnt]++;
if(a[cnt]>=2)
{
a[cnt]-=2;
cnt--;
}
else break;
}
if(a[cnt]<=1)
break;
}
if(strcmp(a,b)==0)//判断是否相等
printf("0verf1ow!\n");
else
{
for(i=0;i<num;i++)
{
printf("%d",a[i]);
}
printf("\n");
}
num=0;
}
return 0;
/**********End**********/
}