题目要求:用小数形式表示形如N/D这样的分数,N是分子,D是分母。如果是循环小数,将循环节放置在括号中,例如:1/3=0.33333333...=0.(3),123/444=0.27702702702...=0.27(702),4/5=0.8 import java.util.ArrayList; import java.util.Scanner; import static java.lang.System.*; /** * 用小数表示分数N/D,如果出现循环节,将循环节放入括号中,e.g. 1/3=0.(3) 123/444=0.27(702) * 算法思想:模拟除法运算,在运算过程中按顺序将余数和对应上的商存入顺序表中,直到余数为零,计算完毕 * 或者,当前余数已经在顺序表中,这意味着出现了循环节 * @author chosen * @date 2011-05-05 */ public class Fraction{ //存储除法运算过程中的余数及对应的商 public static class ModVal{ public final int mod;//余数 public final int result;//商 public ModVal(int m,int r){ mod=m; result=r; } @Override public boolean equals(Object obj){ if(obj==this) return true; if(!(obj instanceof ModVal)) return false; ModVal t=(ModVal)obj; if(t.mod==mod&&t.result==result) return true; return false; } } //将分数N/D转化成小数 public static void toFraction(int n,int d){ int result=n/d; int mod=n%d; ArrayList<ModVal> list=new ArrayList<ModVal>(); ModVal mv=new ModVal(mod,result); while(mod!=0&&!list.contains(mv)){ list.add(mv); result=(mod*10)/d; mod=(mod*10)%d; mv=new ModVal(mod,result); } //出现循环节 if(list.contains(mv)){ out.print(list.get(0).result+"."); int i=list.indexOf(mv); for(int j=1;j<i;j++) out.print(list.get(j).result); out.print("("); for(int j=i;j<list.size();j++){ out.print(list.get(j).result); } out.print(")"); } else if(mod==0){ list.add(new ModVal(mod,result)); out.print(list.get(0).result+"."); if(n%d==0) out.print("0"); else{ for(int i=1;i<list.size();i++) out.print(list.get(i).result); } } } public static void main(String[] args){ Scanner s=new Scanner(in); while(true){ int n=s.nextInt(); int d=s.nextInt(); out.println("------------"); toFraction(n,d); out.println(); } } }