4.15更新 除法:被除数/输出=商…余数,其实余数就相当于被除数,除法写的更平常化一点,应该是,余数/除数=商…余数。那么当余数相同时,除数又不变,那么商必然重复,也因此,可以通过余数相等,来断定出现了循环节。图片来源于百度百科。
题目描述:编写程序,接受3个以N/D形式输入的分数,其中N(0<=N<=65535)为分子,D(0<=D<=65535)为分母,输出它们的小数形式。如果小数形式存在循环节,则用括号括起来。如1/3=.3333…表示为.(3)。
输入用例
8/5 1/3 11/13
输出用例
8/5=1.6
1/3=.(3)
11/13=.(846153)
思路:当有余数与之前余数相同时则表明发生循环。刚开始无思路参考他人博客,其实根本原因在于根本就不会判断什么样的分数是有循环节的。
参考博客:
参考1参考2
代码:
#include<iostream>
using namespace std;
struct Fraction{
int numerator;//分子
int denominator;//分母
int integer;//整数部分
int decimal[100]={0};//小数部分
};
int main(){
Fraction fra[3];
for(int i=0;i<3;i++) scanf("%d/%d",&fra[i].numerator,&fra[i].denominator);
for(int i=0;i<3;i++){
int r[101]={0};//存储余数
printf("%d/%d=",fra[i].numerator,fra[i].denominator);
fra[i].integer=fra[i].numerator/fra[i].denominator;
int cnt=0,flag=-1;//cnt小数位数 flag记录循环开始的数字
r[cnt]=fra[i].numerator%fra[i].denominator;//得到余数
while(r[cnt]){
fra[i].decimal[cnt]=r[cnt]*10/fra[i].denominator;//得到第cnt位小数
for(int j=0;j<cnt;j++){
if(r[j]==r[cnt]) {flag=j;break; }//若有此余数与之前余数相等 则发生循环
}
if(flag!=-1) break;
cnt++;
r[cnt]=r[cnt-1]*10%fra[i].denominator;
}
if(fra[i].integer!=0) cout<<fra[i].integer;//整数部分不为0时输出
cout<<".";//小数点
for(int j=0;j<cnt;j++){
if(j==flag) cout<<"("<<fra[i].decimal[j];
else cout<<fra[i].decimal[j];
}
if(flag==-1) cout<<endl;//flag=-1表明无循环节
else cout<<")"<<endl;
}
return 0;
}