描述小乐乐改数字_牛客题霸_牛客网 (nowcoder.com)

小乐乐喜欢数字,尤其喜欢0和1。他现在得到了一个数,想把每位的数变成0或1。如果某一位是奇数,就把它变成1,如果是偶数,那么就把它变成0。请你回答他最后得到的数是多少。

输入描述:

输入包含一个整数n (0 ≤ n ≤ 109)

输出描述:

输出一个整数,即小乐乐修改后得到的数字。

示例1
输入:222222
输出:0
示例2
输入:123
输出:101

代码1

#include<stdio.h>
int main()
{
	int a= 10011010, b=0, c=0,odd=1,even=0,storage=0;
	//scanf("%d", &a);

	while (a != 0) {
		b = a % 10;
		a /= 10;

		if ((b % 2) == 0) { 
			storage = storage + even; 
		}
		else  {
			
			storage = storage + odd;
			
		}
		storage*=10;
		}
	printf("%d", storage);//实际应该输出10011010
	return 0;
}

在你的代码中,每次循环都执行了 storage *= 10; 这句代码,这会在每次循环中将 storage 左移一位 最终 storage 中存储的数会比预期的大很多,而且数位顺序也是颠倒的。这是因为在每次循环中,storage 都会乘以 10,相当于把上一位的结果左移了一位,而不是累加新的位数 循环再奇偶判断就序列颠倒了 你需要在所有位处理完毕后再反转这个数(或者从最低位开始构建)。

第三次循环的时候 是100 看着没错 但是在第四次 奇数应该加1位的时候, 变成了+1 101, 问题就出来了, 没有使用标志位来表示当前的位置,导致出现了错误计算

等同于

为什么不用storage,storage初始化是0.当低位数也是偶数的时候.加的0 这个时候乘10 ,位数没有变,下次加奇数的时候,就G了

有的可能后面的空零会被下一次的(成功乘10的)标志位抵回来,但是标志位已经不对了呢

#include<stdio.h>
int main()
{
	int a= 10011010, b=0, c=0,odd=1,even=0,storage=0;
	//scanf("%d", &a);
  int multiplier = 1; // 用来表示当前位的权重 
	while (a != 0) {
		b = a % 10;
		a /= 10; 
		if ((b % 2) == 0) { 
			storage = storage + even * multiplier; // 如果是偶数,加上0
		}
		else  { 
			storage = storage + odd * multiplier; // 如果是奇数,加上1
		}		
		printf("%d", storage);
		 printf("更新之前");
		  multiplier *= 10; // 更新当前位的权重
		 printf("更新之后");
		printf("%d", storage);
	  printf("---------------\n");
		}
	printf("%d", storage);//实际应该输出10011010
	return 0;
}	

问题出在循环中对 storage 的操作上 你想将每一位数字转换后存储到 storage 中 但是你的代码在每次修改 storage 后都乘以 10,这会导致每次存储的位数向左移动一位,而不是累积得到正确的结果。

具体来说,你需要在循环结束后再进行乘以 10 的操作,而不是每次循环内部执行

每次循环内都根据当前位的奇偶性加上相应的数值(0或1),并更新 multiplier 的值以保证每次加到正确的位置。最后,输出 storage 即可得到正确结果。

下面是修改后的代码

#include<stdio.h>

int main() {
    int a = 10011010,b=0, c=0,odd=1,even=0;
    int storage = 0;
    int multiplier = 1; // 用来表示当前位的权重

    //scanf("%d", &a);

    while (a != 0) {
        int b = a % 10;
        a /= 10;

        if (b % 2 == 0) {
            storage += even * multiplier; // 如果是偶数,加上0
        } else {
            storage += odd * multiplier; // 如果是奇数,加上1
        }
		 printf("%d", multiplier);
		 printf("更新之前");
        multiplier *= 10; // 更新当前位的权重
		printf("更新之后");
		printf("%d", multiplier);
        printf("-------%d", storage);
		 printf("---------------\n");
    }

    printf("%d", storage); // 实际应该输出10011010

    return 0;
}