解题思路:

注意事项:

参考代码:

#include<stdio.h>

#include<string.h>

int main()

{

        char d[2025];                               //浮点数数组

        int a[2000] = { 0 };                       //整数数组

        int n, len = 0, k = 0;                     //n:2的次方数 len:小数位数 k:字符串长度

        scanf("%d%s", &n, d);             //输入整数n以及浮点数字符串d

        k = strlen(d);                                  //字符串长度

        int t = k - 1;                                     //记录浮点数数字位数(不包含小数点)

        k--;                                                     //调整k,便于将数字逆序存入a中(数组下标从零开始)

        int re = 0;                                         //记录进位数

        //逆序存储数字

        for (int i = 0; i < t; i++)

        {

                if (d[k] == '.')

                {

                        len = i;                               //记录小数部分位数

                        k--;

                }

                a[i] = d[k--] - '0';

        }

        //将所有数字乘以2并处理进位,重复操作n次(2的n次方)

        while (n--)

        {

                for (int i = 0; i < t; i++)

                {

                        a[i] = a[i] * 2 + re;

                        re = a[i] / 10;

                        a[i] %= 10;

                }

                //处理最高位上的进位

                while (re)

                {

                        a[t] = re % 10;                         //进位储存在数组的末位

                        re /= 10;                                    //更新re的值

                        t++;                                            //增加数组长度

                }

        }

        //四舍五入操作

        int tmp = len;

        if (tmp > 0 && a[tmp - 1] >= 5)                          //与小数点相邻的小数大于5则进1

        {

                a[tmp]++;                                                        //加一处理

                while (a[tmp] > 9)                                       //每一位整数部分大于9则继续进位处理

                {

                        a[tmp] %= 10;                                      //或写为a[len]=0,因为若果发生进位情况,则前一位必为9,当前位加一变为10

                        a[++tmp]++;                                         //下标先加一数值再加一

                }

        }

        //更新数组长度

        if (tmp >= t)

        {

                t = tmp + 1;

        }

        //逆序打印数字

        for (int i = t - 1; i >= len; i--)

        {

                printf("%d", a[i]);

        }

        return 0;

}

点赞(0)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论