题解 | #小乐乐改数字#
小乐乐改数字
https://www.nowcoder.com/practice/fcd30aac9c4f4028b23919a0c649824d
#include<stdio.h> #include<math.h>//因为用到了pow(a,b)次方函数 int main() { int n,g,o=0,k=0;//定义n为输入整数,g代表每个数位上的数,o为输出整数,k为中间量 scanf("%d",&n);//输入 while(n!=0) { g=n%10;//取输入整数最后数位上的数 //判断最后位上的数是奇数还是偶数,用%2取余是否等于0来判断 g=g%2;//若为偶数,%2取余等于0,g=0;若为奇数,%2取余等于1,g=1;符合题目要求 o=o+g*pow(10,k); //pow(10,k)表示10的k次方,大家和我一样自己推一下,我也是看大佬写的,我自己想不到这么妙的方法,但自己试着多推了几次,明白了是怎么回事儿,确实妙不可言 k++;//k累加1 n=n/10;//向左移,更新最后一位,因为每除10,都要进行保留整数部分,原先的最后一位会变成小数而被遗弃 } printf("%d",o);//输出结果 return 0; }
总结:
如:n=123
进while循环判断条件(n!=0),此时n=123不等于0,进入循环
{
g=n%10;//此时g=3
g=g%2;//若为偶数,%2取余等于0,g=0;若为奇数,%2取余等于1,g=1;符合题目要求,此时g=1
o=o+g*pow(10,k);//o=0+1*10的0次方=1
k++;//k=0+1=1
n=n/10;//n=123/10=12.3但保留整数部分,n=12
}
再进while循环判断条件(n!=0),此时n=12不等于0,进入循环
{
g=n%10;//此时g=2
g=g%2;//若为偶数,%2取余等于0,g=0;若为奇数,%2取余等于1,g=1;符合题目要求,此时g=0
o=o+g*pow(10,k);//o=1+0*10的1次方=1
k++;//k=1+1=2
n=n/10;//n=12/10=1.2但保留整数部分,n=1
}
再进while循环判断条件(n!=0),此时n=1不等于0,进入循环
{
g=n%10;//此时g=1
g=g%2;//若为偶数,%2取余等于0,g=0;若为奇数,%2取余等于1,g=1;符合题目要求,此时g=1
o=o+g*pow(10,k);//o=1+1*10的2次方=101
k++;//k=2+1=3
n=n/10;//n=1/10=0.1但保留整数部分,n=0
}
再进while循环判断条件(n!=0),此时n等于0,不进入循环
printf("%d",o);//输出结果
反思:
我自己刚开始没理解好题意,认为是像221122,应该输出为001100,用数组做了半天,但题目要求是输出转换为整数