zoukankan      html  css  js  c++  java
  • 29-整数转为小数(**高精度)

    题目:

    请写出一个程序,接受一个以N/D(0<=N<=65535,0<=D<=65535)的形式输入的分数,其中N为分子,D为分母,输出它的小数形式(运算结果小数点后最多保留100位)。假如它的小数形式存在循环节,要将其用括号括起来。例如:1/3=.33333...表示为.(3),又如41/333=.123123123...表示为.(123)。

    一些转化的例子:

    1/3=0.(3)

    22/5=4.4 
    1/7=0.(142857)

    3/8=0.375 
    11/59= 0.(1864406779661016949152542372881355932203389830508474576271)  

    45/47=0.(9574468085106382978723404255319148936170212765)              

    17/79= 0.(2151898734177)                                               

    16/33= 0 .(48)

    思路:完全模拟除法运算,可以手算一下来理解,直接用float,double精度是不够的。

    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    int main(){
    	int res[150], mod[150];
    	int n, m;
    	cin >> n >> m;
    	res[0] = n / m;   //res[0]存小数的整数部分,res[1~]存放小数部分 
    	mod[0] = n % m;   //mod 存放除不开的余数部分
    	int cnt = 1;
    	int i = 0, x = 0, j = 0;
    	while(cnt <= 100 && mod[cnt - 1] != 0){
    		res[cnt] = (mod[cnt - 1] * 10) / m;  //完全模拟除法,可以手动除法来理解,10 / 7 -> 3 / 7 => 3 * 10 / 7 -> 
    		mod[cnt] = (mod[cnt - 1] * 10) % m;
    		if(mod[cnt] == 0)
    			break;
    		else{
    			for(i = 1; i < cnt; i++){      //找循环节 
    				if(mod[i] == mod[cnt]){    //余数相同则后面的运算就相同,就是循环节 
    					break; 				   //循环节从i开始到cnt - 1 
    				}
    			}
    			if(i < cnt){
    				x = i;	  //记录循环节开始的位置		
    				break;
    			} 
    		}
    		cnt++;
    	}
    	if(x == 0){						//无循环节  
    		cout << res[0] << ".";
    		for(i = 1; i <= cnt; i++)
    			cout << res[i];
    	}
    	else{							//循环小数 
    		cout << res[0] << ".";
    		for(i = 1; i < x; i++)
    			cout << res[i];
    		cout << "(";
    		for(i = x; i < cnt; i++)
    			cout << res[i];
    		cout << ")";
    	}
    	return 0;
    }
    
  • 相关阅读:
    版本管理
    图解电路
    Java语言基础
    电工学入门
    11个例子教会你看电路图
    如何提高STM32的学习效率
    开发板入门
    Altium Designer
    电子设计从零开始
    推荐书籍
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7449244.html
Copyright © 2011-2022 走看看