c语言高精度计算 s=1-12+13-14+......+199-1100精确到小数点后100位

c语言高精度计算 s=1-12+13-14+......+199-1100精确到小数点后100位,第1张

两整数相除精确到小数点后100位

#include<stdio.h>

#define N 100

main()

{int x,y,yu,i,zen

int num[N+3]

printf("请输入被除数!\n")

scanf("%d",&x)

printf("请输入除数!\n")

scanf("%d",&y)

zen=x/y

num[1]='.'

for(i=2i<=N+2i++)

{yu=x%y

num[i]=(yu*10)/y

x=yu*10%y

}

printf("%d.",zen)

for(i=2i<=N+2i++)

{printf("%d",num[i])

if(i%5==0) printf("\n")

}

}

其实它大概的思路如下:

计算出两个大数的长度,并记录最大长度

在共同长度内进行计算,分为进位和不进位两种情况

根据长度较大的大数长出的部分粘到结果,再根据进位情况调整

输出结果

其实个人觉得他的思路虽然没有错,但不够清晰,可以进行一定的改进

#include <stdio.h>

int main() {

    char addend1[1001] = {0}

    char addend2[1001] = {0}

    char result[1001] = {0}

    int length1, length2, resultLength

    int carryOver = 0

    int i, mark

    printf("请输入第一个加数")

    scanf("%s", &addend1)

    printf("请输入第二个加数")

    scanf("%s", &addend2)

    for (length1 = 0 addend1[length1] length1++) // 注意是以分号结尾,求出第一个数的长度

    length1--  // 因为后面是计算到length1-1,所以要减1

    for (length2 = 0 addend2[length2] length2++) // 求出第二个数的长度

    length2--

    resultLength = length1 > length2 ? length1 : length2   // 记录最大长度

    for (i = 0 i <= resultLength i++) {   // 在最大长度内进行计算

        if((i <= length1) && (i <= length2)) {  // 如果两个数在这个位置都有数

            result[resultLength - i] = addend1[length1 - i] - '0' + addend2[length2 - i] + carryOver   // 计算该位的值,为两个加数的值之和再加上进位

            if(result[resultLength - i] > '9') {    // 如果需要进位

                carryOver = 1  // 标记有进位,且为1

                result[resultLength - i] -= 10 // 减去进1位所需要的10

            } else {

                carryOver = 0  // 标记无进位

            }

        } else {    // 如果两个数最多只有一个数在这个位置有值,则退出循环

            break

        }

    }

    mark = i   // 记录一个数比另一个数多出的开始位置

    if (i <= length1) { // 如果是第一个数多出的话,那根据第一个数多出的部分计算

        while (i <= length1) {

            result[resultLength - i] = addend1[length1 - i]

            i++

        }

    }

    if (i <= length2) {     // 如果是第二个数的话,则根据第二个数计算

        while (i <= length2) {

            result[resultLength - i] = addend2[length2 - i]

            i++

        }

    }

    for(i = mark carryOver i++) { // 如果在多出的位置有进位的话,则根据进位一步一步向前进位,直至没有进位为止

        result[resultLength - i] += 1

        if (result[resultLength - i] > '9') {

            result[resultLength - i] -= 10

        } else {

            if (i > resultLength) {

                printf("1")

            }

            break

        }

    }

    for (i = 0 i <= resultLength i++) {   // 输出结果

        if (result[i]) {

            printf("%c", result[i])

        }

    }

    return 0

}

欢迎追问,满意请采纳,谢谢


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11848175.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存