小乐乐改数字_牛客题霸_牛客网 (nowcoder.com)
#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,用数组做了半天,但题目要求是输出转换为整数