猎神冬日之战百度云:求此题目解

来源:百度文库 编辑:神马品牌网 时间:2024/05/01 00:59:56
循环节
输入两个正整数 n、m,求n除以m的结果,如果能除尽,则输出其准确值,否则输出其循环部分。

如: n=2 m=16 则输出 0.125

n=1 m=7 则输出 142857

数据规模:(1< n , m <10000)
pascal题目
我不会编啊!

pascal已经很就没有用了,给你一个c的程序,你自己学习一下好了。

因为你要求的范围(1< n , m <10000) 太大,因此我做了一些简化,计算(1< n , m <100),你自己看着扩大数组好了。

使用数组精确计算M/N(0<M<N<=100)的值。如果M/N是无限循环小数,则计算并输出它的第一循环节,同时要求输出 循环节的起止位置(小数位的序号)

*问题分析与算法设计
由于计算机字长的限制,常规的浮点运算都有精度限制,为了得到高精度的计算结果,就必须自行设计实现方法。
为了实现高精度的计算,可将商存放在一维数组中,数组的每个元素存放一位十进制数,即商的第一位存放在第一个元素中,商的第二位存放在第二个元素中....,依次类推。这样就可以使用数组不表示一个高精度的计算结果。
进行除法运算时可以模拟人的手工操作,即每次求出商的第一位后,将余数乘以10,再计算商的下一位,重复以上过程,当某次计算后的余数为0 时,表示M/N为有限不循环小数某次计算后的余数与前面的某个余数相同时,则M/N为无限循环小数,从该余数第一次出现之后所求得的各位数就是小数的循环节。
程序具体实现时,采用了数组和其它一些技巧来保存除法运算所得到的余数和商的各位数。

*程序与程序注释
#include<stdio.h>
int remainder[101],quotient[101]; /*remainder:存放除法的余数; quotient:依次存放商的每一位*/
void main()
{
int m,n,i,j;
printf("Please input a fraction(m/n)(<0<m<n<=100):");
scanf("%d/%d",&m,&n); /*输入被除数和除数*/
printf("%d/%d it's accuracy value is:0.",m,n);
for(i=1;i<=100;i++) /*i: 商的位数*/
{
remainder[m]=i; /*m:除的余数 remainder[m]:该余数对应的商的位数*/
m*=10; /*余数扩大10位*/
quotient[i]=m/n; /*商*/
m=m%n; /*求余数*/
if(m==0) /*余数为0 则表示是有限小数*/
{
for(j=1;j<=1;j++) printf("%d",quotient[j]); /*输出商*/
break; /*退出循环*/
}
if(remainder[m]!=0) /*若该余数对应的位在前面已经出现过*/
{
for(j=1;j<=i;j++) printf("%d",quotient[j]); /*则输出循环小数*/
printf("\n\tand it is a infinite cyclic fraction from %d\n",remainder[m]);
printf("\tdigit to %d digit after decimal point.\n",i);
/*输出循环节的位置*/
break; /*退出*/
}
}
}

自己把程序编出来就知道了啊~