从实验报告中选取出来的比较有意思的问题:
从键盘输入分子b和分母a,判断该分数(真分数)是否是无限循环小数,并给出循环开始出现的位数。验证如下结论是否正确:
(对于分数b/a,小数点至多a位, 或a位之内开始出现无限循环。)
例如:
3/8 = 0.375 //小数点不超过7位(有限小数)
1/3 = 0.333333…//从1位开始出现无限循环
1/7 = 0.142857 142857 142857 //6位开始(7位内)出现循环序列:142857
6/7 = 0.857142 857142 857142 //6位开始(7位内)出现循环序列:857142
(试试神奇的分数1/49和100/9801,100/9899)
提示:
假设分数是3/8=0.375
小数第1位上的数字是30/8的商,就是表达式30/8的值:3
30%8(求余)的值是6,那么 小数第2位上的数字是60/8的值:7
60%8(求余)的值是4,那么,小数第3位上的数字是40/8的值5
#include<iostream>
#include<vector>
using namespace std;
int main() {
int
flag2;
do
{
int
denom, numer;
cout
<< "请输入分子和分母: ";
cin
>> numer >> denom;
while(numer
>= denom) {
cout
<< "输入错误!请重新输入!" << endl;
cout
<< "请输入分子和分母: ";
cin
>> numer >> denom;
}
int
flag1 = 0;
int
remainder = (numer * 10) % denom;
int
quotient = int(numer * 10 / denom);
vector<int>
v;
v.push_back(quotient);
int
beg = 0;
int
end = 0;
vector<int>::iterator
iter, iter1;
while(!flag1
&& remainder) {
quotient
= int(remainder * 10 / denom);
remainder
= (remainder * 10) % denom;
v.push_back(quotient);
if(v.size()
> denom && beg == end)
break;
else
{
if(beg
== end) {
for(iter
= v.begin(); iter != v.end() - 1; iter++) {
if(*iter
== v.back()) {
beg
= iter - v.begin();
end
= v.end() - v.begin();
break;
}
}
}
else {
iter
= v.begin();
iter1
= iter + beg + (v.end() - v.begin()) - end;
if(*iter1
!= v.back())
beg
= end = 0;
else
if(iter1 == v.begin() + end)
flag1
= 1;
}
}
}
if(remainder
== 0)
cout
<< "有限小数!\n";
else
if(flag1 == 0)
cout
<< "无限但不循环小数!\n";
else
cout
<< "无限循环小数! 且循环区间开始的位置为 " << end - 1 << endl;
cout
<< "---------------------------------------------\n";
cout
<< "是否继续判断循环,如果是,请输入1, 否则0: ";
cin
>> flag2;
}
while(flag2);
return
0;
}