循环小数2
题目描述
输入整数a和b(0<=a<=3000, 1<=b<=3000),输出a/b的循环小数表示及循环节长度。 如 1/33 = 0.0303030303.... (03不断循环)。那么它的输出格式为"0.(03)" ,2,后面的数字表示循环节长度。
输入格式
有若干对a,b。 每对数据,输入两个整数a, b。0<=a<=3000, 1<=b<=3000。
输出格式
具体请看样例。 每对数据一组输出结果,各组结果之间用空行分隔。 每组结果格式如下:每组结果包括两行。 第一行:先输出等式及结果。 第二行:先输出3个空格,然后输出一个整数,表示循环节长度,最后输出“ = number of digits in repeating cycle”。
输入样例
76 25
5 43
1 397
输出样例
76/25 = 3.04(0)
1 = number of digits in repeating cycle
5/43 = 0.(116279069767441860465)
21 = number of digits in repeating cycle
1/397 = 0.(00251889168765743073047858942065491183879093198992...)
99 = number of digits in repeating cycle
样例说明
请严格按照格式要求输出。如果小数长度超过50位,只输出前面50位,后面用“...”表示还有更多内容,如输出样例的第三组数据。
主要思路
这道题有三个核心: 1、 初始部分 2、 非循环部分 3、 循环部分 4、 统计循环节
中心思想就是模拟除法竖式的操作,如果某一时刻某两个数余数相同,即为结束循环节,再不断地围绕循环节去操作。
ps:每次第二行输出时前面要加三个空格
——————————AC代码
#include<bits/stdc++.h>
using namespace std;
int res[3001],mod[3001],a,b,p,pp;
vector<int>ans;
int main(){
while(scanf("%d %d",&a,&b)!=EOF){
memset(res,0,sizeof(res));
memset(mod,0,sizeof(mod));
printf("%d/%d = %d.",a,b,a/b);
a%=b;
ans.clear();
ans.push_back(0);
int i=0,flag=0,j;
while(1){
res[i]=a/b;
mod[i]=a%b;
a=(a%b)*10;
for(j=1;j<i;j++)
if((res[j]==res[i]) && (mod[j]==mod[i])){
flag=1;
break;
}
if(flag){break;}
i++;
}
p=0;pp=0;
for(int i=1;i<j;i++,pp++)cout<<res[i];
cout<<"(";
for(int k=pp+1;k<i;k++) {
p++;pp++;
if(pp<=50){
printf("%d",res[k]);
}
}
if(pp>50){
printf("...");
}
printf(")\n %d = number of digits in repeating cycle\n\n",p);
}
return 0;
}
——————————QAQ
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18122209
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话