C语言高手来呀!!!!
谁能告诉我 高精度除法(C语言) 怎么搞呀!!!
谁能告诉我 高精度除法(C语言) 怎么搞呀!!!
答案:使用数组精确计算M/N(0<M<N<=100)的值。如果M/N是无限循环小数,则计算并输出它的第一循环节,同时要求输出 循环节的起止位置(小数位的序号)
*问题分析与算法设计
由于计算机字长的限制,常规的浮点运算都有精度限制,为了得到高精度的计算结果,就必须自行设计实现方法。
为了实现高精度的计算,可将商存放在一维数组中,数组的每个元素存放一位十进制数,即商的第一位存放在第一个元素中,商的第二位存放在第二个元素中....,依次类推。这样就可以使用数组不表示一个高精度的计算结果。
进行除法运算时可以模拟人的手工操作,即每次求出商的第一位后,将余数乘以10,再计算商的下一位,重复以上过程,当某次计算后的余数为0 时,表示M/N为有限不循环小数某次计算后的余数与前面的某个余数相同时,则M/N为无限循环小数,从该余数第一次出现之后所求得的各位数就是小数的循环节。
程序具体实现时,采用了数组和其它一些技巧来保存除法运算所得到的余数和商的各位数。
*程序说明与注释
#include<stdio.h>
int remainder[101],quotient[101]; /*remainder:存放除法的余数; quotient:依次存放商的每一位*/
int 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; /*退出*/
}
}
}#include<sdtio.h>
int main()
{
int a,b;
printf("%d",a/b);
}高精度除法就是高精度减法的深一层次,其实高精度的思想就是我们平时算题时列竖式一样,比如加法从右到左一位一位的算大于10就进位,减法一样,只是如果碰到了不够减的情况把加法的进位的变量变成借位的变量(例如t为此变量,加法在执行时,a,b两个变量为两个数的同一位上的两个数,若a+b>10 则t-->1 如果是减法 若a-b<0 t--> -1 每一次运算都要加上t当然做了判断后要把哪一位相加得到的答案进行处理(加法-10 减法 a+10-b)。
至于你的这道题我也不知道应该怎么处理,但是我认为用高精度会不会太复杂了,一般的求最大公约数和最小公倍数用辗转相除法,我想这道题应该是这种方法的改进形式是最好的方法。数值的精度是与计算机的位数有关 一般在位数之内可以通过对数据精度的定义完成答案补充当然 定义变量时是不能多变量定义精度的 这能把它定义成long 或者是double很容易的,只要把商和余数定义为一个结构体:typedef struct Integer{int quotient;int remainder;}Int;
然后做除法运算嘛:
int divident , divisor;
Int result ;
scanf("%d%d",÷nt,&divisor);
result.quotient = divident/divisor ;
result.remainder = divident%divisor ;
不知道是不是你要的结果
上一个:二级C语言排序技术2
下一个:求救一道c语言题目