解题思路:先从预估的最大位数进行匹配,匹配成功得到实际位数后,进行“取商(最高位)输出-取余再进行下一次的取商(下一个最高位)输出”循环。而求数字逆序则需要将 “实际最大除数div_max/当前最高位除数div 得到 逆序后该数字所在的位数”,举个例子,实际为4位的数字2345,则实际最大除数为div_max=1000,若此时最高位的除数div为1000,即取出的商为2,这个最高位的2应当逆序后在最低位的2,即2*(div_max/div)=2*(1000/1000)=2,就从千位数变成个位数了。

注意事项:细心即可,多多调试,看似比较繁琐,实则比较简单,主体仅仅是一次for循环和里面的几条if-else语句!而且具有通用性,修改n值即可判断处理任意位数的整数!

参考代码:

/*作业1009 数字的处理与判断*/

/*不采用数组等方法*/

#include <stdio.h>

int main()

{

    int num; //输入整数

    int i,j; //循环变量

    int x; //商(本次循环输出)和余(下一次循环被除数)

    int y; //数字逆序

    int n = 5; // 预估最大位数

    int div = 1; //除数

    int div_max = 0; //实际匹配成功后的最大位数的除数

    int flag = 0; // 匹配成功标志位

    int sum = 0; //数字逆序和


    scanf("%d",&num);

    x = num; //初始值(不超过n位的整数)num

    for(i=1;i<n;i++)

        div *= 10; //最大初始除数div(10的n次方)


    for(i=1;i<=n;i++)

    {

        x = x/div; //取商,即取最高位,也即循环取各位数字


        //预估位数与实际位数匹配

        if(x==0) //最高位为0,即预估位数与实际num的位数不匹配,需要重新匹配

        {

            n--; //降低预估位数

            div /= 10; //除数降低10倍

            i = 0; x = num; //回到循环初始状态

            continue;

        }

        //预估位数=实际位数,匹配成功

        if(flag==0)

        {

            printf("%d\n",n); //1、输出该数字的实际位数

            div_max = div; //得到实际最大除数,便于求数字逆序

            flag = 1; //置标志位为1,表匹配成功,正式循环输出数字

        }


        //2、循环输出各位数字

        if(i<n)

            printf("%d ",x);

        else

            printf("%d\n",x);


        y = x*(div_max/div); //数字逆序

        sum += y; //数字逆序和


        //取余,最高位调整到下一位

        x = num%div;

        div /= 10;

    }

    printf("%d",sum);//3、输出数字逆序和


    return 0;

}

点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论