描述小乐乐改数字_牛客题霸_牛客网 (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;
}