小数循环节

题目

要求你对给定的两个整数做除法,如果是有限小数,直接表达。如果是无限循环小数,用方括号标出它的循环节。
【输入】1/7
【输出】0.[142857]
再例如,12345/1700:
7.26[1764705882352941]

迭代器相关

查找

  • 在容器remainder中查找a元素
vector<int>::iterator x=find(remainder.begin(),remainder.end(),a);

选取元素

  • vector a,类似数组选取元素a[4]
  • 迭代器选元素,vector::iterator i=a.begin(),此时*i类似于a[0]。
  • 如果vector::iterator j=a.begin()+5,则*j=a[5]

分析

  • 用vector来存贮商quotient和余数remainder
  • 商和余数是一一对应的关系
  • 余数为0,说明是除尽,将vector中对应的元素打印输出
  • 在vector中查找余数是否出现过,如果有同样的余数,说明是循环小数,相应打印输出。
  • 有相同的余数,则为判定循环节的标志。

代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
	int a,b;
	cin>>a>>b;
	cout<<a/b<<".";
	a=a%b;
	vector<int>quotient,remainder;
	remainder.push_back(a);
	while(true){
		if(a==0){
			for(vector<int>::iterator i=quotient.begin();i!=quotient.end();++i){
				cout<<*i;
			}
			break;
		}
		quotient.push_back(a*10/b);
		a=a*10%b;
		vector<int>::iterator x=find(remainder.begin(),remainder.end(),a);
		if(x==remainder.end())
			remainder.push_back(a);
		else{
			vector<int>::iterator j=quotient.begin();
			for(vector<int>::iterator i=remainder.begin();i!=x;++i){
				cout<<*j;
				++j;
			}
			cout<<"[";
			for(;j!=quotient.end();++j)
				cout<<*j;
			cout<<"]";
			break;
		}
	} 
	return 0;
}
在C语言中,将分数转换成小数并显示循环(如果有的话),通常涉及两个步骤:首先,需要将分数转换成小数形式,然后检查是否存在无限循环小数部分。下面是一个简单的示例程序,用于完成这个任务: ```c #include <stdio.h> #include <math.h> // 将分子除以分母得到小数表示 double fraction_to_decimal(int numerator, int denominator) { double decimal = (double)numerator / denominator; return decimal; } // 检查小数是否有循环 int has_inf_loop(double num) { int digit[10], pos = -1; // 存储循环开始的位置 while (fabs(num - floor(num)) > 1e-6 && ++pos < 10) { num *= 10; digit[pos] = (int)num; if (digit[pos] == digit[pos % 10]) { return pos; } } return -1; // 如果不是循环小数,则返回-1 } int main() { int numerator = 123456789; // 分子 int denominator = 100000000; // 分母 double decimal = fraction_to_decimal(numerator, denominator); printf("Fraction: %.1f\n", decimal); int loop_pos = has_inf_loop(decimal); if (loop_pos != -1) { printf("Decimal has a repeating pattern starting at position %d: ", loop_pos); for (int i = 0; i <= 5; ++i) { // 显示前五个重复位 printf("%d", digit[(loop_pos + i) % 10]); } printf("..."); } else { printf("No repeating pattern found.\n"); } return 0; } ``` 在这个程序中,`fraction_to_decimal`函数用于将分数转换为小数,`has_inf_loop`函数检查并确定是否存在无限循环。注意,实际应用中可能需要处理更复杂的边界情况和输入验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值