求循环小数的表示以及循环节长度是什么_循环小数和无限循环小数的关系「建议收藏」

求循环小数的表示以及循环节长度是什么_循环小数和无限循环小数的关系「建议收藏」问题:输入整数a和b,输出a/b的循环小数表示以及其循环节长度

问题:输入整数a和b,输出a/b的循环小数表示以及其循环节长度。例如 a=5 b=43 小数表示为0.(116279069767441860465),循环节长度为21

分析:模拟长除法的计算过程。

①mod = a%b;

②小数 = (mod*10) / b;

③mod = (mod*10)%b;

循环②③步,当出现重复的余数的时候,也就是循环节出现了

例如 3/7

求循环小数的表示以及循环节长度是什么_循环小数和无限循环小数的关系「建议收藏」


1.  mod = 3%7 = 3;

2. mod = (3*10)/ 7 = 4  (小数点后第一个数)

3. mod = (3*10)%7 = 2

4. mod = (2*10)/ 7 = 2 (小数点后第二个数)

5. mod = (2*10)%7 = 6

………..

我的方法(菜鸟):

#include<iostream>
using namespace std;

int main() {
	int a, b, t, k, i;
	int book[3000] = { 0 }; //标记第一个余数
	int count[100] = { 0 };// 记录循环小数
	cin >> a >> b;

	count[0] = a / b; // 小数点左边的数
	t = a%b; // 余数
	book[t] = 1; // 记下第一个余数

	count[1] = (t * 10) / b; // 小数点后一位数
	t = (t*10)%b; //继续求余

	k = 2;
	while (book[t] == 0) {  //循环直到出现 第一次出现 的 余数
		count[k] = (t * 10) / b;
		t = (t*10)%b;
		k++;
	}

	cout << count[0] << ".(";
	for (i = 1; i < k; i++)cout << count[i];
	cout << ")";
	return 0;

}

大牛的方法:

#include<iostream>
using namespace std;
#include<string>
#include<map>
#include<assert.h>

map<int, int> Pos; //记录每一次的 被除数 以及 被除数在循环小数中的位置
void solve(int n, const int d, string &ans, int &r) {
	assert(n < d && n%d);
	ans = '.';
	Pos.clear();

	while (1) {
		n *= 10;
		int p = Pos[n]; 
		if (p == 0) Pos[n] = ans.size(); // 如果被除数没有出现过,则把 被除数的位置 用ans的索引值
		else {
			r = ans.size() - p; // 如果出现重复的被除数,则用当前的 ans长度 - 重复被除数的最初位置 得到 节长度
			if (r > 50) {  // 节长度大于50 用...表示后面
				ans.erase(p + 50);
				ans += "...";
			}
			ans.insert(p, "(");
			ans += ")";
			break;
		}

		if (n < d) {
			ans += "0"; //被除数 小于 除数的时候 ans补上0
			continue;
		}

		int mod;
		mod = n%d;
		ans += (char)(n / d + '0'); //整数转换成字符
		n = mod;

		if (n == 0) { //如果不是循环小数
			ans += "0";
			r = 1;
			break;
		}
	}

}

int main() {
	int a, b;
	cin >> a >> b;
	int r = 1;
	string ans = "0";
	solve(a%b, b, ans, r);
	printf("%d%s", a / b, ans.c_str());
	cout << r;
	return 0;
}

今天的文章求循环小数的表示以及循环节长度是什么_循环小数和无限循环小数的关系「建议收藏」分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/85007.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注