蓝桥杯2024年第15届B组试题D

这个题我在C语言网蓝桥得了95分,不知道哪里错了。如果有大佬看出来了,

请给我评论指出我的错误,谢谢。

C语言网蓝桥:蓝桥杯真题 - 编程题库 - C语言网

试题D: R格式

时间限制: 1.0s 内存限制: 256.0MB 本题总分:10分

【问题描述】

小蓝最近在研究一种浮点数的表示方法:R格式。对于一个大于0的浮点 数d,可以用R格式的整数来表示。给定一个转换参数n,将浮点数转换为R 格式整数的做法是:

  1. 将浮点数乘以(2的n次方);

  2. 四舍五入到最接近的整数。

【输入格式】

一行输入一个整数n和一个浮点数d,分别表示转换参数,和待转换的浮点数。

【输出格式】

输出一行表示答案:d用 R格式表示出来的值。

【样例输入】

2 3.14

【样例输出】

13

【样例说明】

3.14 × 22 = 12.56,四舍五入后为 13。

【评测用例规模与约定】

对于50%的评测用例:1≤n≤10,1≤将d 视为字符串时的长度≤15。

对于 100% 的评测用例:1 ≤ n ≤ 1000,1 ≤ 将 d 视为字符串时的长度 ≤ 1024;保证 d 是小数,即包含小数点。

解析:

这个题我们要会高精度乘法,用高精度乘法做2的n次方,这个之前的高精度乘法思路一样(不会请看我以前发的高精度乘法:高精度运算(乘法)和一个题(洛谷p1303)-CSDN博客

这个高精度是乘法的变形;

这个就不需要字符数组了,我们直接定义一个整型数组(因为每次都乘于2),找个变量num存为数,中间的和高精度乘法一样(不会的看我主页的高精度乘法),到了最后我们判断a[num]的数是否大于0,大于0就加1;

代码:

cs 复制代码
#include<stdio.h>
#include<string.h>
#define max 2010
int main(){
	int a[max]={0},b[max],c[max];
	int n,i,j,num=1,d=0;
	a[0]=1;
	scanf("%d",&n);//2的n次幂 
	for(i=0;i<n;i++){
		for(j=0;j<num;j++){
		a[j]=a[j]*2;	
		}
		for(j=0;j<num;j++){//进位 
		a[j+1]+=a[j]/10;
		a[j]=a[j]%10;}
		if(a[num]>0){//判断是否因为进位而位数+1 
			num++;
		}
	}
	for(i=num-1;i>=0;i--){
		printf("%d",a[i]);
	}
	return 0;
}

小数怎么处理呢,我们可以定义个字符数组,求出小数位数 e和整数位数,

把字符数组转换相应的整型数组(有几个小数就乘几个10),然后用上面求出2的n次方的数组和这个数组相乘,判断前面有没有多的0,再进位,再判断第e个数是否大于等于5

成立前的数+1,

代码:

cs 复制代码
#include<stdio.h>
#include<string.h>
#define max 5100
#define fu 1030
int main() {
	char A[fu];
	int a[max]={0},b[max],c[max]= {0};
	int n,i,j,num=1,z,e=0,m;
	a[0]=1;
	scanf("%d%s",&n,&A);
	m=strlen(A);
	for(i=0; i<n; i++) {
		for(j=0; j<num; j++) {
			a[j]=a[j]*2;
		}
		for(j=0; j<num; j++) {
			a[j+1]+=a[j]/10;
			a[j]=a[j]%10;
		}
		if(a[num]>0) {
			num++;
		}
	}
	j=0;
	for(i=m; i>=0; i--) {
		if('0'<=A[i]&&A[i]<='9') {
			b[j]=A[i]-'0';
			j++;
		}
		if(A[i]=='.') {
			e=i;
		}
	}
	e=strlen(A)-e-1;
	m=j;
	for(i=0; i<num; i++) {
		for(j=0; j<m; j++) {
			c[i+j]+=a[i]*b[j];
		}
	}
	num=num+m;

	for(i=0; i<num; i++) {
		for(i=0; i<num; i++) {
			c[i+1]+=c[i]/10;
			c[i]%=10;
		}
	}
	for(; !c[num-1]&&num!=1;) {
		num--;
	}
	if(c[e-1]>=5) {
		c[e]=c[e]+1;
	}
	for(i=num-1; i>=e; i--) {
		printf("%d",c[i]);
	}
	return 0;
}

若有错误,请评论指出错误,谢谢;

相关推荐
生成论实验室3 分钟前
《事件关系阴阳博弈动力学:识势应势之道》第二篇:阴阳博弈——认知的动力学基础
数据结构·人工智能·科技·神经网络·算法
风筝在晴天搁浅32 分钟前
字节高频题 小于n的最大数
算法
LabVIEW开发34 分钟前
LabVIEW水力机组空蚀在线监测
算法·labview·labview知识·labview功能·labview程序
AI科技星40 分钟前
科幻艺术书本封面:《全域数学》第一部·数术本源 第三卷 代数原本(P95-141)完整五级目录【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
风筝在晴天搁浅42 分钟前
LeetCode 92.反转链表Ⅱ
算法·leetcode·链表
weisian1511 小时前
基础篇--概念原理-2-参数是什么?——从原理到实战,一篇讲透
面试·职场和发展·模型参数·7b和70b·参数=规则,不是原始数据
王老师青少年编程1 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【贪心与二分判定】:数列分段 Section II
c++·算法·贪心·csp·信奥赛·二分判定·数列分段 section ii
V搜xhliang02461 小时前
OpenClaw科研全场景用法:从文献到实验室的完整自动化方案
运维·开发语言·人工智能·python·算法·microsoft·自动化
天真小巫1 小时前
2026.5.2总结
职场和发展
汉克老师2 小时前
GESP2025年3月认证C++五级( 第三部分编程题(2、原根判断))
c++·算法·模运算·gesp5级·gesp五级·原根·分解质因数