6-36 提取偶数位上的数 (5分)
从低位开始取出变量s中偶数位上的数,依次构成一个新数并返回。说明:最低位为奇数位,高位仍在高位,低位仍在低位。 例如,当s中的数为:1211245时,新数为:214。
函数接口定义:
int fun (int s);
其中 s 是用户传入的参数。 s 为非负整数;函数须返回偶数位上的新数。
裁判测试程序样例:
#include <stdio.h>
int fun (int s);
int main()
{ int s, t;
while(scanf("%d", &s)!=EOF)
{
t=fun(s);
printf("%d\n", t);
}
return 0;
}
/* 请在这里填写答案 */
输入样例:
1211245
输出样例:
214
int fun (int s)
{
int a[100],i=0,n,y=0;
while(s!=0){ //样例1211245
a[i]=s%10;/*定义i=0的目的就是给a[0]装数*/ //mat:b=s%10,这样写都没往数组里装!
s=s/10;
/*现在a[0]==5, 4, 2, 1 ,1, 2 ,a[n-1]==1 }
//mat:自己理解为砸后,1,2,1,1,2,4,5倒序进入数组a[0]=5,4, 2, 1 ,1, 2 ,1
整体数的位次也会发生改变(即1是各位,十位是2,以此类推),
但是实则没变(各位是5,十位4,百2,千1,万1,十万1,百万2,千万1)OK!
反馈:1211245 中‘偶数位’即十位(4),千位(1),十万位(2)。
a[0]==5,
a[1]== 4(十),
a[2]== 2,
a[3]== 1(千) ,
a[4]== 1,
a[5]== 2(十万) ,
a[6]=1 (偶数位对应的角标正好是奇数)
*/
i++; /*作用1体现从a[0]开始往后按顺序装数 a[1],a[2]... 奇数,
作用2计数
//mat:自己以为这是只起到计数作用, 所以用了别的字母去当计数器,程序就坏了
以为第21行会自动往数组里装数且全部装完,但实质一次循环只能装一次。所以必须用i*/
}
n=i;
for(i=n-1;i>=0;i--){ //for(i=n-1;i【>0】;i--)也对,因为没有用上个位。
if(i%2==1)//如果角标是奇数,就重新组数喽。
y=y*10+a[i];
}
return y;
}