打卡信奥刷题(1025)用C++实现信奥 P1530 [USACO2.4] 分数化小数 Fractions to Decimals
写一个程序,输入一个形如DN的分数,输出它的小数形式。如果小数有循环节的话,把循环节放在一对圆括号中。例如,310.33333333写成0.333341写成0.123,整数x写成x.0。
P1530 [USACO2.4] 分数化小数 Fractions to Decimals
题目描述
写一个程序,输入一个形如 ND\dfrac{N}{D}DN 的分数,输出它的小数形式。如果小数有循环节的话,把循环节放在一对圆括号中。
例如,13=0.33333333…\dfrac{1}{3}=0.33333333\ldots31=0.33333333… 写成 0.(3)0.(3)0.(3),41333=0.123123123…\dfrac{41}{333}= 0.123123123\ldots33341=0.123123123… 写成 0.(123)0.(123)0.(123),整数 xxx 写成 x.0x.0x.0。
输入格式
输入包含两个整数 NNN 和 DDD(1≤N,D≤1051 \leq N,D \leq 10^51≤N,D≤105)。
输出格式
输出按照上面规则计算出的小数表达式。如果结果长度大于 767676,每行输出 767676 个字符。
输入输出样例 #1
输入 #1
45 56
输出 #1
0.803(571428)
说明/提示
翻译来自NOCOW
USACO 2.4
C++实现
#include
#include
#include
#include
using namespace std;
int n,d,k,w,sum,len;
string ans;
int pd[100005];
int main(){
scanf(“%d%d”,&n,&d);
k=n/d,w=-1;
do {
ans=char(k%10+‘0’)+ans;
k/=10;
}while(k>0);
ans+=‘.’;
n=n%d;
do {
if(pd[n]!=0) {
w=pd[n];
break;
}
else pd[n]=ans.size();
n*=10;
k=n/d;
ans+=char(k+‘0’);
n=n%d;
}while(n!=0);
if(w!=-1) ans+=‘)’;
len=ans.size();
for(int i=0;i<len;i++) {
if(iw) {
putchar(‘(’);
i–;
w=-1;
}
else putchar(ans[i]);
sum++;
if(sum%760) putchar(‘\n’);
}
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐



所有评论(0)