1 条题解
-
0
题意分析
题目要求计算有理数在进制下的展开形式,并提取小数点后指定位置范围内的数字。具体规则如下:
-
进制展开:
- 给定有理数(,),计算其在7进制下的小数部分。
- 例如:
- 的进制展开为。
- 的进制展开为。
-
数字提取:
- 输入指定起始位置和结束位置(,)。
- 位置表示小数点后的第一位。
- 输出从位置到的数字序列。
解题思路
关键点分析
-
7进制小数展开:
- 使用长除法计算的进制小数部分。
- 每次除法步骤:
- 将当前余数乘以。
- 计算商(即当前小数位的数字)。
- 更新余数为新的余数。
- 重复直到达到所需精度。
-
数字提取:
- 需要计算足够多的小数位以覆盖位置。
- 存储小数位的数字序列,直接提取到的子序列。
-
边界处理:
- 如果,则小数部分全为。
- 如果是整数,则小数部分全为。
解决步骤
-
输入处理:
- 读取问题集数量。
- 对每个问题集,读取、、、。
-
7进制展开计算:
- 初始化余数为。
- 重复长除法直到计算到位置的小数位:
- 余数。
- 当前数字。
- 余数。
- 如果余数为,则后续小数位全为。
-
数字提取与输出:
- 存储小数位的数字序列。
- 提取从到的子序列作为结果。
- 格式化输出。
算法复杂度
- 时间复杂度:,每个问题集最多计算位小数。
- 空间复杂度:,存储小数位的数字序列。
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> int main() { int n,num,p,i,a,b,l,r; int ans[5050]; scanf("%d",&n); for(num=1;num<=n;num++) { memset(ans,0,sizeof(ans)); scanf("%d %d %d %d",&a,&b,&l,&r); p=a; a=a%b; int k=0; while(k<=r) { a=a*7; ans[k]=a/b; a=a%b; k++; } printf("Problem set %d: %d / %d, base 7 digits %d through %d: ",num,p,b,l,r); for(i=l;i<=r;i++) { printf("%d",ans[i]); } printf("\n"); } return 0; }
-
- 1
信息
- ID
- 1710
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者