难题求解答-c语言程序设计(很难的一道题)

问题描述

c语言程序设计(很难的一道题)

一、将分数变小数:写出一个程序,接受一个以N/D的形式输入的分数,其中N为分子,D为分母,输出它的小数形式。如果它的小数形式存在循环节,要将其用括号括起来。例如:1/3=.00000...表示为.(3),又如41/333=.123123123...表示为.(123)。
一些转化的例子: 1/3=.(3) 22/5=4.4 1/7=.(142857) 3/8=.375 45/46=.803(571428)
??用上面的分数和13/79来测试你的程序。求高手

解决方案

有两个关键点:
1. 不能用float等浮点数类型,要用整数类型和高精度处理。
2. 需要了解循环小数的产生来源于除数中有2和5以外的因子。
以下C++代码在g++下编译通过,可以处理D<10000的情况,循环节不超过40位。我的电脑上没有C编译程序,但除了头文件包含部分,我都尽量按照C语言的格式写了,希望对你有帮助。
不过,45/46你给的结果不正确,应该是:.9(7826086956521739130434),你可以用计算器验算一下。
望采纳。

#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;

#define LEN 10
#define EACH_MAX 10000

//高精度取余
int exactRemainder(int* K, int D){
    int i;
    int tmp[LEN];
    memcpy(tmp, K, sizeof(int) * LEN);
    for(i = LEN - 1; i > 0; i--){
        tmp[i] %= D;
        tmp[i - 1] += tmp[i] * EACH_MAX;
    }
    return tmp[0] % D;
}

//高精度输出循环节(99999...999/D*N)
void printCirculator(int *K, int D, int N){
    int begin = 0;
    int i;
    int tmp[LEN];
    memcpy(tmp, K, sizeof(int) * LEN);

    for(i = LEN - 1; i > 0; i--){
        tmp[i - 1] += (tmp[i] % D) * EACH_MAX;
        tmp[i] /= D;
    }
    tmp[0] /= D;

    for(i = 0; i < LEN; i++){
        tmp[i] *= N;
    }
    for(i = 0; i < LEN - 1; i++){
        tmp[i + 1] += tmp[i] / EACH_MAX;
        tmp[i] %= EACH_MAX;
    }

    for(i = LEN - 1; i >= 0; i--){
        if(begin == 1){
            printf("%04d", tmp[i]);
        }else if(tmp[i] != 0){
            begin = 1;
            printf("%d", tmp[i]);
        }
    }
}

//在999..9前面再加一个9
void next9(int *K){
    int i;
    for(i = 0; i < LEN; i++){
        K[i] *= 10;
    }
    for(i = 0; i < LEN - 1; i++){
        if(K[i] >= EACH_MAX){
            K[i + 1] += K[i] / EACH_MAX;
            K[i] %= EACH_MAX;
        }
    }
    K[0] += 9;
}

int main(){
    int N, D;
    int K[LEN];
    memset(K, 0, sizeof(int) * LEN);
    scanf("%d%d", &N, &D);

    //如果N比D大,则有整数部分,先输出
    if(N >= D){
        printf("%d", N / D);
    }
    N %= D;
    //小数点
    printf(".");

    //把D因子中的10,2,5都除去
    while(1){
        if(D % 10 == 0){
            D /= 10;
            if(N % 10 == 0){
                N /= 10;
            }else if(N >= D){
                printf("%d", N / D);
                N %= D;
            }else{
                printf("%d", 0);
            }
        }else if(D % 2 == 0){
            N *= 5;
            D *= 5;
        }else if(D % 5 == 0){
            N *= 2;
            D *= 2;
        }else{
            break;
        }
    }
    //此时N < D且D因子中不含有2和5,即纯循环部分
    if(N != 0){
        printf("(");
        next9(K);
        while(exactRemainder(K, D) != 0){
            next9(K);
        }
        printCirculator(K, D, N);
        printf(")");
    }
    printf("n");
    return 0;
}

解决方案二:

你这道题没意义。
因为计算机丢失的精度究竟是循环部分,还是精度失真的部分你没法说清楚。
N/D=(N/D)(括号中的代表结果),(N/D)*D这个值你能说清楚是怎么来的吗?

时间: 2024-12-29 07:00:06

难题求解答-c语言程序设计(很难的一道题)的相关文章

服务器-企业级账号发布app遇难题 求解答

问题描述 企业级账号发布app遇难题 求解答 **我把打包好的.ipa文件和相同名字的.plist文件放到服务器 用自带浏览器访问时 出现如图情况: ** 跳到UC浏览器后 不能下载,如图: 请高手指点啊~~~~~ 解决方案 http://blog.csdn.net/chenyong05314/article/details/38826463

求解答c语言的一个小问题

问题描述 求解答c语言的一个小问题 #include "stdio.h" int main() { int a,b; while(scanf("%d%d",&a,&b)==2) printf("%d ",a+b); return 0; } 那句while是什么 我不明白 解决方案 函数 scanf() 是从标准输入流stdio (标准输入设备,一般是键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中.

bigbluebutton-哪位大神了解bigbulebutton,小弟遇到一个难题求解答

问题描述 哪位大神了解bigbulebutton,小弟遇到一个难题求解答 小弟最近碰到一个问题,有个客户自己在ubuntu14.04上安装的bigbluebutton总是报webrtc echo test failed,因为客户那边用的是mac,所以一开始以为是浏览器不支持,但换了别的浏览器以后一样报错,错误代码还根据不同的浏览器会变化.请问这种问题如何解决? 解决方案 http://docs.bigbluebutton.org/install/install.html 看下后面的排错部分

求解答-C语言51单片机串口通信程序求教

问题描述 C语言51单片机串口通信程序求教 #include #include #include #define INBUF_LEN 4 //数据长度 unsigned char inbuf1[INBUF_LEN]; unsigned char checksum,count3; bit read_flag=0; void init_serialcomm(void) { SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr TMOD

跪求解答-c语言描述:为整数定义

问题描述 c语言描述:为整数定义 为整数定义一个抽象数据类型,它包含整数的常见运算,每一个运算对应一个函数,由它的输入/输出定义 解决方案 十字链表的定义及C语言描述C语言itoa()函数和atoi()函数详解(整数转字符C实现)C语言itoa()函数和atoi()函数详解(整数转字符C实现) 解决方案二: 实现整数的四则运算?还是要实现运算符重载?

求解答- java语言想要运算器程序可以运行出正负数及小数点运算

问题描述 java语言想要运算器程序可以运行出正负数及小数点运算 public class Calculator { private CalcEngine engine; private UserGUI gui; public Calculator() { engine=new CalcEngine(); gui=new UserGUI(engine); } public void show() { gui.setVisible(true); } public static void main(

求 《java语言程序设计_进阶篇》课后完整答案

问题描述 如题,可以的话发到54438561@qq.com.或者给个淘宝网站什么的,我去买也行啊.谢谢啊. 解决方案 解决方案二:不知道,从未看过这类东西

新手-c++基础问题,求解答!

问题描述 c++基础问题,求解答! 本来一个很简单的字符串拼接问题,因为题目要在2个字符串之间加逗号和空格,感觉很烦了, 我的方法代码看起来很丑,有没有更好方法,谢谢! #include<iostream> #include<string> int main() { using namespace std; string s1,s2,s3; char t[3]={',',''}; cout << "Enter your first name: ";

链表一直不太会,求大神解答(c语言)

问题描述 链表一直不太会,求大神解答(c语言) 这是我写的链表程序,然而编译都过不了,找不到错,很惭愧... 求大神解答 然后我还想知道我写的程序的基本思路是对的吗? #include #include typedef struct lnode Lnode; struct Lnode { int data; Lnode *next; } Lnode * makeNode(int data) { Lnode *new_node=(Lnode *)malloc(sizeof(Lnode)); if(