给定任意正整数数字,求其位数并顺序、逆序输出各位数字

题目:给一个不多于5位的正整数,要求:
(1)、求出它是几位数
(2)、分别输出每一位数字
(3)、按逆序输出各位数字

解答:
(1)、

写法1 :
int Several_digits (int n)
{
    if (n>9999 && n<100000)
    {
        printf("五位数字");
    }
    if (n>999 && n<10000)
    {
        printf("四位数字");
    }
    if (n>99 && n<1000)
    {
        printf("三位数字");
    }
    if (n>9 && n<100)
    {
        printf("二位数字");
    }
    if (n>0 && n<10)
    {
        printf("一位数字");
    }
   return 0;
}    

//最原始的代码,局限性过大,代码量过大,仅局限于五位以内正整数的位数判断。
//当数据量加大时无法适应,无法正确识别负数、零并判断其位数。

写法2 :
int Several_digits (int n)
{
    int i;
    if (n<=0)
    {
    printf("NULL");
    }
    else if (n>0) 
    {
        for ( i=1;(n/10)!=0;i++)
        {
            n=n/10;
        }
    return i;
    }
}
int main()
{
    printf("%d\n",Several_digits(0));
    printf("%d\n",Several_digits(-2458));
    printf("%d\n",Several_digits(2458));
    printf("%d\n",Several_digits(12));
    return 0;
}

//简单运用if_else语句,对任意给定数字正负性提供判断。
//简单运用for语句,提升函数可实现性。

写法3 :
int Several_digits(int n)
{
    int i = 0;
    while (n!=0)
    {
    i++;
    n=n/10;
    }
return i;
}
int main()
{
    printf("%d\n",Several_digits(0));
    printf("%d\n",Several_digits(-2458));
    printf("%d\n",Several_digits(2458));
    printf("%d\n",Several_digits(12));
    return 0;
}
//简单运用while语句,提升代码可实现性,但当给定数字位为0时无法正确判断给定数字位数。

写法4:
int Several_digits(int n)
{
    int i = 0;
    do
    {
        i++;
        n /= 10;
    }while(n != 0);
    return i;
}
int main()
{
    printf("%d\n",Several_digits(0));
    printf("%d\n",Several_digits(-2458));
    printf("%d\n",Several_digits(2458));
    printf("%d\n",Several_digits(12));
     return 0;
}
//在写法3的基础上继续优化,可以正确判断出当给定任意数字时,数字的位数。
//此时此程序可以解决当给定任意整数时,输出其位数。
//求位数运算及求给定数字除以10不等于0时的次数的运算。
//do_while语句与while语句循环次数为零次及以上,循环条件为0、1时各不相同,循环条件大于1时完全相同。
//do_while不会总比while多执行一次,仅当循环条件为0时,do_while多执行一次。

(2)、

写法1 :
int  Sequential_output(int n)
{
    int a,b,c,d,e;
    a=n/10000;
    b=(n-a*10000)/1000;
    c=(n-a*10000-b*1000)/100;
    d=(n-a*10000-b*1000-c*100)/10;
    e=(n-a*10000-b*1000-c*100-d*10)/1;
    printf("%d %d %d %d %d\n",a,b,c,d,e);
    return 0;
}

//最原始的代码,可以输出给定数字的每一位值,但编写过程过于繁杂,极易出错。
//去掉最高为后,剩余数字为原给定数字除以原给定数最大位数最小数的余数

写法2:
void Sequential_output(int n)

{
    int power=1;
    int m=Several_digits (n);
    for(int i=1;i    {
        power=power*10;
    }
    for(int j=0;j    {
        printf("%d ",n/power);
        n=n%power;
        power=power/10;
    }
    printf("\n");
}
//采用for语句,将Several_digits函数的返回值作为循环条件
//需要与Several_digits(写法2)配合使用

写法3 :
void Sequential_output(int n)
{
    int count;
    int i;
    int power = 1;
    count = Several_digits(n);
    for(int i=0;i    {
        power = power*10;
    }
    do
    {
        printf("%d ",n/power);
        n = n % power;
        power = power / 10;
    }while(n!=0);
    printf("\n");
}
//需要与函数Several_digits(写法4)共同使用。
//顺序输出运算即用该数字除以相应位数最小数字的运算

(3)、

写法1 :
int Reverse_output(int n)
{
    int a,b,c,d,e;
    a=n/10000;
    b=(n-a*10000)/1000;
    c=(n-a*10000-b*1000)/100;
    d=(n-a*10000-b*1000-c*100)/10;
    e=(n-a*10000-b*1000-c*100-d*10)/1;
    printf("%d %d %d %d %d\n",e,d,c,b,a);
    return 0;
}
//最原始代码,仅将顺序输出时的变量顺序进行调整,无实际意义

写法2:
void Reverse_output(int n)
{
    int m=Several_digits (n);
    for(int i=0;i    {
        printf("%d ",n%10);
        n=n/10;
    }
    printf("\n");
}
//采用for语句,将Several_digits函数的返回值作为循环条件
//需要与Several_digits(写法2)配合使用

写法3 :
void Reverse_output(int n)
{
    if(n < 0)
    {
        printf("-");
        n = -n;
    }
    do
    {
        printf("%d ",n%10);
        n /= 10;
    }while(n!=0);
    printf("\n");
}
//需要与函数Sequential_output(写法3)共同使用
//逆序输出运算即将给定数字按顺序依次除10取余并按顺序输出余数的运算。

你可能感兴趣的:(C指针,Question)