47.計算分數(shù)的精確值
使用數(shù)組精確計算M/N(0 *問題分析與算法設(shè)計
由于計算機字長的限制,常規(guī)的浮點運算都有精度限制,為了得到高精度的計算結(jié)果,就必須自行設(shè)計實現(xiàn)方法。
為了實現(xiàn)高精度的計算,可將商存放在一維數(shù)組中,數(shù)組的每個元素存放一位十進制數(shù),即商的第一位存放在第一個元素中,商的第二位存放在第二個元素中....,依次類推。這樣就可以使用數(shù)組不表示一個高精度的計算結(jié)果。
進行除法運算時可以模擬人的手工操作,即每次求出商的第一位后,將余數(shù)乘以10,再計算商的下一位,重復(fù)以上過程,當(dāng)某次計算后的余數(shù)為0 時,表示M/N為有限不循環(huán)小數(shù)某次計算后的余數(shù)與前面的某個余數(shù)相同時,則M/N為無限循環(huán)小數(shù),從該余數(shù)第一次出現(xiàn)之后所求得的各位數(shù)就是小數(shù)的循環(huán)節(jié)。
程序具體實現(xiàn)時,采用了數(shù)組和其它一些技巧來保存除法運算所得到的余數(shù)和商的各位數(shù)。
*程序與程序注釋
#include
int remainder[101],quotient[101]; /*remainder:存放除法的余數(shù); quotient:依次存放商的每一位*/
void main()
{
int m,n,i,j;
printf("Please input a fraction(m/n)(<0 scanf("%d/%d",&m,&n); /*輸入被除數(shù)和除數(shù)*/
printf("%d/%d it's accuracy value is:0.",m,n);
for(i=1;i<=100;i++) /*i: 商的位數(shù)*/
{
remainder[m]=i; /*m:除的余數(shù) remainder[m]:該余數(shù)對應(yīng)的商的位數(shù)*/
m*=10; /*余數(shù)擴大10位*/
quotient[i]=m/n; /*商*/
m=m%n; /*求余數(shù)*/
if(m==0) /*余數(shù)為0 則表示是有限小數(shù)*/
{
for(j=1;j<=1;j++) printf("%d",quotient[j]); /*輸出商*/
break; /*退出循環(huán)*/
}
if(remainder[m]!=0) /*若該余數(shù)對應(yīng)的位在前面已經(jīng)出現(xiàn)過*/
{
for(j=1;j<=i;j++) printf("%d",quotient[j]); /*則輸出循環(huán)小數(shù)*/
printf("\n\tand it is a infinite cyclic fraction from %d\n",remainder[m]);
printf("\tdigit to %d digit after decimal point.\n",i);
/*輸出循環(huán)節(jié)的位置*/
break; /*退出*/
}
}
}
使用數(shù)組精確計算M/N(0
由于計算機字長的限制,常規(guī)的浮點運算都有精度限制,為了得到高精度的計算結(jié)果,就必須自行設(shè)計實現(xiàn)方法。
為了實現(xiàn)高精度的計算,可將商存放在一維數(shù)組中,數(shù)組的每個元素存放一位十進制數(shù),即商的第一位存放在第一個元素中,商的第二位存放在第二個元素中....,依次類推。這樣就可以使用數(shù)組不表示一個高精度的計算結(jié)果。
進行除法運算時可以模擬人的手工操作,即每次求出商的第一位后,將余數(shù)乘以10,再計算商的下一位,重復(fù)以上過程,當(dāng)某次計算后的余數(shù)為0 時,表示M/N為有限不循環(huán)小數(shù)某次計算后的余數(shù)與前面的某個余數(shù)相同時,則M/N為無限循環(huán)小數(shù),從該余數(shù)第一次出現(xiàn)之后所求得的各位數(shù)就是小數(shù)的循環(huán)節(jié)。
程序具體實現(xiàn)時,采用了數(shù)組和其它一些技巧來保存除法運算所得到的余數(shù)和商的各位數(shù)。
*程序與程序注釋
#include
int remainder[101],quotient[101]; /*remainder:存放除法的余數(shù); quotient:依次存放商的每一位*/
void main()
{
int m,n,i,j;
printf("Please input a fraction(m/n)(<0
printf("%d/%d it's accuracy value is:0.",m,n);
for(i=1;i<=100;i++) /*i: 商的位數(shù)*/
{
remainder[m]=i; /*m:除的余數(shù) remainder[m]:該余數(shù)對應(yīng)的商的位數(shù)*/
m*=10; /*余數(shù)擴大10位*/
quotient[i]=m/n; /*商*/
m=m%n; /*求余數(shù)*/
if(m==0) /*余數(shù)為0 則表示是有限小數(shù)*/
{
for(j=1;j<=1;j++) printf("%d",quotient[j]); /*輸出商*/
break; /*退出循環(huán)*/
}
if(remainder[m]!=0) /*若該余數(shù)對應(yīng)的位在前面已經(jīng)出現(xiàn)過*/
{
for(j=1;j<=i;j++) printf("%d",quotient[j]); /*則輸出循環(huán)小數(shù)*/
printf("\n\tand it is a infinite cyclic fraction from %d\n",remainder[m]);
printf("\tdigit to %d digit after decimal point.\n",i);
/*輸出循環(huán)節(jié)的位置*/
break; /*退出*/
}
}
}