解题思路:
注意事项:
参考代码:
#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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复