题目如上↑
a>=0部分的替换挺简单,不多赘述,代码如下:
c=a%10;switch(c)//c为上方a对10求整结果,即a的十位{case 0:case 1:case 2:m=1;//十位为0,1,2则m=1break;case 3:m=2;//十位为3则m=2break;case 4:m=3;//十位为4则m=3break;case 5:m=4;//十位为5则m=4break;default:m=5;//十位为6及以上则m=5break;}
负数部分不用if难以区分出(由题可知若a为负数,则m恒为1)
我的思路(逆推)是(单就正负判断):
1.用switch区分正负;
2.将a对2取余(a%2)得出1和-1(需要a为奇数);
3.因此先判断a的奇偶性,若a为偶数则使其+1。
所以说判断a的正负的步骤如下:
1.判断a的奇偶性,若a为偶数则使其+1(变成奇数);
2.将a对2取余(a%2)得出1和-1;
3.通过用switch区分2.中得出的1和-1来判断a的正负。
代码实现:
switch(a%2)//判断a的奇偶性(用于对2取余后判断a的正负){case 0:a+=1;//若a为偶数则+1break;case 1:break;//若a为奇数则不变}b=a%2;//经过上述处理,a一定为奇数,使其对2求余只有两种结果:1或-1switch(b){case -1://若a%2==-1则a为负数,直接赋值m=1m=1;break;case 1://若a%2==1则a为正数,对a的范围进行进一步判断break;}
所有代码如下:
#include<stdio.h>#include<stdlib.h>int main(void){int a=0,b=0,c=0,m=0;scanf("%d",&a);//输入ac=a/10;switch(a%2)//判断a的奇偶性(用于对2取余后判断a的正负){case 0:a+=1;//若a为偶数则+1break;case 1:break;//若a为奇数则不变}b=a%2;//经过上述处理,a一定为奇数,使其对2求余只有两种结果:1或-1switch(b){case -1://若a%2==-1则a为负数,直接赋值m=1m=1;break;case 1://若a%2==1则a为正数,对a的范围进行进一步判断switch(c)//c为上方a对10求整结果,即a的十位{case 0:case 1:case 2:m=1;//十位为0,1,2则m=1break;case 3:m=2;//十位为3则m=2break;case 4:m=3;//十位为4则m=3break;case 5:m=4;//十位为5则m=4break;default:m=5;//十位为6及以上则m=5break;}break;}printf("m=%d\n",m);system("pause");return 0;}