C语言:计算分数精确值

来源:互联网 发布:甄子丹功夫怎么样知乎 编辑:程序博客网 时间:2024/05/22 08:23

1 计算分数精确值(10分)
题目内容:
由于计算机内部表达方式的限制,浮点运算都有精度问题,为了得到高精度的计算结果,就需要自己设计实现方法。
(0,1)之间的任何浮点数都可以表达为两个正整数的商,为了表达这样两个数的商,可以将相除的结果存放在一维数组中,数组的每个元素存放一位十进制数字。即商的第一位存放在第一个元素中,第二位存放在第二个元素中,以此类推,就可以用数组来表达一个高精度的除法结果了。
如16/19的结果0.8421052631…就可以依次存放8、4、2、1、0、5、2、6、3、1…在数组中。
而除法的过程,则可以模仿人工列竖式做除法的方式,先将被除数乘以10,得到一位商以后,将余数乘以10作为下一轮计算的被除数:
160/19->8余8
80/19->4余4

当某次余数为0时,则表明除尽。
现在,请写一个程序,输入一个分数,计算出它的小数形式。无论是否可以除尽,输出最多小数点后200位。

输入格式:
形如
a/b
的两个数,其中10<=a

#include <stdio.h>#include <stdlib.h>/*现在,请写一个程序,输入一个分数,计算出它的小数形式。无论是否可以除尽,输出最多小数点后200位。 */int *calculator(int a, int b);int main() {//    printf("Hello, World!\n");    int a, b;//    printf("%s\n", "input a,b from console:");    scanf("%d/%d", &a, &b);//    a = 16, b = 19;//    printf("a/b = %d/%d\n", a, b);    int *pInt = calculator(a, b);    int *p = pInt;//    printf("第一位是0哦 %d\n",*p);    printf("%s", "0.");    int count = 0;    while (++p != NULL) { // 刚好跳过第一位!        if (count > 200) {            break;        }        printf("%d", *p);        count++;    }    printf("%s", "\n");    return 0;}int *calculator(int a, int b) {    // 10<=a<b<100if (a < 10 || b >= 100 || a >= b) {        printf("%s\n", "10<=a<b<100 , 条件不满足");        return NULL;    }    int *ret = calloc(200, sizeof(int));    int *tmp = ret;    int count = 0;    while (a % b != 0) {        if (a < b) {            a *= 10;            tmp++;        }        *tmp = (a / b);        a = a % b;        count++;        if (count > 200) {            *tmp = '\0'; // useless            break;        }    }    return ret;}
console:16/19  # 这个是输入,下面的是输出0.842105263157894736842105263157894736842105263157894736842105263157894736842105263157894736842105263157894736842105263157894736842105263157894736842105263157894736842105263157894736842105263157894736840Process finished with exit code 0