2.28 2018年第三题

题目描述:
编写程序,接受 3 个以 N/D 形式输入的分数,其中 N(0<=N<=65535)为分子,D
(0<=D<=65535)为分母,输出他们的小数形式。如果小数存在循环节,则用括号括起来,如
1/3=.33333…表示为 0.(3)。
例如,
输入:

8/5 1/3 11/13

输出:

8/5=1.6
1/3=.(3)
11/13=.(846153)

代码:

#include

using namespace std;

void printresult(int n,int m){

    cout<<n<<'/'<<m<<'=';
    int intpart=n/m;
    int restpart=n%m;

    int floatpart[100];
    int i=0;

    while(i<100&&restpart!=0){
        floatpart[i++]=restpart*10/m;
        restpart=restpart*10%m;
    }

    if(restpart==0){

        cout<<intpart<<'.';
        for(int j=0;j<i;j++){
            cout<<floatpart[j];
        }
        return ;
    }

    int endpoint=0;

    for(int j=1;j<100;j++){
       if(floatpart[j]==floatpart[0]){
            for(int z=0;z<j;z++){
                for(int k=j+z;k<100;k=k+j){
                    endpoint=j;
                    if(floatpart[k]!=floatpart[z]){
                        endpoint=0;
                        break;
                    }
                }
                if(endpoint==0){
                    break;
                }
            }
       }

       if(endpoint!=0){
            break;
       }
    }

    cout<<intpart<<'.'<<'(';
    for(int j=0;j<endpoint;j++){
        cout<<floatpart[j];
    }
    cout<<')';
    return ;
}
int main(){

    int n[3],m[3];
    char c;

    for(int i=0;i<3;i++){
        cin>>n[i]>>c>>m[i];

    }

    for(int i=0;i<3;i++){
        printresult(n[i],m[i]);
        cout<<endl;
    }



}

小结
这题的难点在于循环小数找出循环体
1.由于要找出循环体,故最好是把每一位小数存储在数组里面:floatpart[i++]=restpart10/m;
restpart=restpart
10%m;
restpart表示的就是余数
2.分类讨论两种情况,第一种不是循环小数,则一直除会使restpart==0,则代表为有限小数,第二种循环小数,我默认的是保存100个小数位的值(暂时认为是足够了的),再进行判断
3.判断使用了三层循环,第一层,找出与第一位小数值相等的数,猜测可能是循环体的第一位数。第二层开始检测,依次检测 j 之前的循环体是否在后面出现

 for(int z=0;z<j;z++){
 	for(int k=j+z;k<100;k=k+j){
		endpoint=j;
		if(floatpart[k]!=floatpart[z]){
        	endpoint=0;
            break;
        }
    }
    if(endpoint==0){
         break;
    }
}

你可能感兴趣的:(华科复试)