(算法)精确表示小数

题目:

给定一个正整数n,求1/n的小数表示,如:

1/2=0.5

1/3=0.(3)

1/6=0.1(6)

1/7=0.(142857)

其中括号表示小数中的循环部分。

思路:

考虑一下除法运算的过程:

当余数与之前运算出现重复时,那么说明循环已经开始,因此可以通过hash表来记录余数对应的位置。

被除数  除数  余数  商

1     7   1   0

1*10         7   3   1 

3*10      7    2   4

2*10    7    6     2       

6*10      7    4   8

4*10    7    5   5 

5*10         7   1   7 

1*10         7   3   1 

3*10      7    2   4

2*10    7    6     2       

6*10      7    4   8

4*10    7    5   5 

5*10         7   1   7 

代码:

#include<iostream>
#include<map>
#include<sstream>
using namespace std;

string decimalRepresent(int n){
    map<int,int> mp;
    int num=10;
    int residue=1;
    string multi;
    int idx=0;

    while(mp.find(residue)==mp.end()){
        if(residue==0){
            stringstream ss;
            string tmp;
            ss<<1.0/n;
            ss>>tmp;
            return tmp;
        }

        mp[residue]=idx;

        stringstream sstr;
        string str;
        sstr<<num/n;
        sstr>>str;
        multi=multi+str;
        idx++;

        residue=num%n;
        num=residue*10;
    }

    string result="0."+multi.substr(0,mp[residue])+"("+multi.substr(mp[residue])+")";
    return result;
}

int main(){
    int n;
    while(cin>>n){
        cout<<"The result of 1/"<<n<<": "<<endl;
        cout<<decimalRepresent(n)<<endl;
    }

    return 0;
}
时间: 2024-10-14 07:13:55

(算法)精确表示小数的相关文章

JS正则--非负整数或小数[小数最多精确到小数点后两位]

function ValidPrice(obj) { s = obj.value; //var reg = /^[0-9]*\.[0-9]{0,2}$/; var reg = /^[0-9]+([.]{1}[0-9]{1,2})?$/; if (!reg.test(s)) { obj.value = ""; alert("必须为>=0的金额,精确到小数点后2位!"); obj.focus(); obj.select(); return false; } ret

求斐波那契数列的相邻两项的比值,精确到小数后三位。

未完成,只能假设知道是9和10代入. 代码如下: package zuoye; import java.math.BigDecimal; /* * 求斐波那契数列的相邻两项的比值,精确到小数后三位. * p1,p2,p3......pi,pj,...求pi/pj * 1 1 2 3 5 8 13 * 5/8,8/13,...收敛 */ public class Test { static double feibo(int x){ if(x==1||x==2) return 1; return f

Java中double类型的数据精确到小数点后两位

Java中double类型的数据精确到小数点后两位 多余位四舍五入,四种方法 一: double f = 111231.5585;BigDecimal b = new BigDecimal(f); double f1 = b.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue(); 二: new java.text.DecimalFormat("#.00").format(3.1415926) 三: double d = 3.1415926

精确到小数点后n位的两种方法

引言:大家在写程序中多多少少会遇到这个问题,特别对一些初学者会出现这个问题,做个ACM竞赛的同学肯定都会用C语言的printf格式控制输出,但是习惯于用C++的同学也不是一点办法都没有啊,这篇blog中会介绍C++中如何使用,虽然稍微复杂一定,但是也不失为一种方法. 首先看一下代码(以求四个整数的和与平均值为例): //求四个整数的和与平均值 #include<iostream> #include<iomanip> using namespace std; int main() {

四则运算,除法改了一下,可以精确到小数两位

#include<stdio.h>#include<time.h>#include<math.h>main(){ int input,op,i; float d1,d2,inputf; srand((unsigned)time(NULL)); printf("\n-------------------欢迎使用: 小学四则运算  -------------------\n"); for(i=0;i<15;i++) { op=rand()%4; d

课后作业 06 -- 小数后几位精确判断并输出

Console.Write("输入您要精确的小数:"); string strA = Console.ReadLine(); Console.Write("您要精确到几位小数:"); int k = int.Parse(Console.ReadLine()); double n = Convert.ToDouble(strA); int i = strA.IndexOf(".");//确定小数索引位置 string strB = string.E

股票开盘的最大成交额-----一道不错的贪心算法题目

本篇文章非解题报告,只是发表一下本人的对该题的解题思路,在本算法中涉及了对数据的存储,筛选,排序,业务实现. 最后会附上个人写的代码,以满足多组测试示例,不知道是否是完全正确的.希望有看出问题的博友给出意见,或者针对本题有更好方法的,请给出提示,多谢! ps:由于前两篇发到首页的文章,被管理员移除,说解题报告类型的文章不适合发布到首页.这篇文章而非解题报告,是什么呢?我也说不好了,先发一下吧,希望遇到交流者. rePs:事情证明,我这篇还是解题报告类型的文章.在发到首页不到两分钟的时间又被移除了

算法竞赛入门经典_第二章:循环结构程序设计_上机练习_MyAnswer

习题2-1 位数 输入一个不超过109的正整数,输出它的位数.例如12735的位数是5.请不要使用任何数学函数,只用四则运算和循环语句实现. #include<stdio.h> int main(void) { int n; int digit = 0; scanf("%d",&n); while(n) { n = n / 10; digit++; } printf("%d\n", digit); return 0; } 习题2-2 水仙花数 输

分治算法(一)

当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出.对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法.如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止.这就是分治策略的基本思想. 1.引例: 如果给你一个装有16枚硬币的袋子,其中有一枚是伪造的,并且那枚伪造硬币的重量和真硬币的重量不同.你能不能用最少