《數據結構與算法分析:C語言描述》習題1.3代碼及自己的想法

《數據結構與算法分析:C語言描述》習題1.3

大一狗放假在家自學點算法,編程渣,自己練習一下

————————————————————————————————————————(我是劃分線)

題目:只使用處理I/O的PrintDigit函數,編寫一個過程以輸出任意實數(可以為負)

分析:書中已經給出了一個範例來打印正整數,那麼打印實數的關鍵在於將小數部分和整數部分區分開來,也就是分別用intPart和floatPart分別表示整數部分和小數部分轉換成的正整數,然後分別將intPart和floatPart用書中已經給出的PrintOut函數打印即可。一開始寫程序的時候我沒有考慮到計算機存儲double的方式,如2.16會被保存為2.15999999999999等,所以原來試圖通過先乘10再對10取餘來確定小數位數,後來發現做不到。。。。在網上看了人家發的代碼,發現大多是直接將小數位數當作參數傳給函數,好吧。。。。問題簡化很多。。。。所以後來也直接將小數位數當參數傳給了函數~~不過還要注意一下,比如上面提到的例子:2.16存储为2.15999999999,顯然,傳給函數的小數位數應該是2,而當我們將小數部分0.1599999999*10*10後,得到的是15.9999999999,對其取整是15。。。而正確的應該是16,所以應在對15.9999999取整後加1才是正確的結果。不過我有一個疑問,计算机存储double类型的时候像3.20呢?是存储为3.19999999还是3.2000000000?有點問題啊。。。求解答~

#include <cstdio>
#include <cmath>
void PrintDigit(int n);
void PrintOut(int n);
void PrintReal(double n,int dig);

int main()
{
    double readin;
    int dig;

    printf("请输入一个实数以及它的小数位数:\n");
    scanf("%lf", &readin);
    scanf("%d",&dig);
   
    
    if(readin<0)
    {
        readin=-readin;     //若数字为负数,则将其变为正数
        printf("-");        //并打印一个负号
    }
    
    PrintReal(readin, dig);

   
    return 0;
}


void PrintDigit(int n)   //只能输出单个数字的函数
{
    printf("%d",n);
}

void PrintOut(int n)     //只能输出整数的函数
{
    if (n>=10)
       PrintOut(n/10);
    PrintDigit(n-(n/10)*10);
}


void PrintReal(double n,int dig)   //能输出实数的函数
{
    int intPart,floatPart;   //将输入数字转换成整数部分和小数部分
    double fp;
    
        intPart=(int)n;    //将数字取整即为原数字整数部分
    PrintOut(intPart);      //先输出整数部分
    if ( (n-intPart)>0 )  //若存在小数部分
    {
        printf(".");           //输出小数点
        fp=n-intPart;     //截取小数部分
    }
    floatPart=1+fp*pow(10.0, dig);    //将小数部分转为整数后的值赋值给floatPart
    PrintOut(floatPart);          //打印转变为整数后的小数部分
}

在這個程序中,我將負數的轉換放在了main函數裡,可能不是很好,不過。。。懶得改了。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值