Write a function to output an arbitrary double number (which might be negative) using only printDigit for I/O. For example, the output number will be 10.55 for input number 10.548.The compiled source code is required.
编写一个函数,仅将printDigit用于I / O,以输出任意双数(可能为负数)。例如,输入数字10.548的输出数字将为10.55。需要编译的源代码。
程序思路:考虑到小数进位问题,将双精度浮点数拆分成整数和小数两个部分,为保留两位小数,可将小数部分100+0.5并取整,同时判断是否进位。进位情况分两种,整数部分进位和小数部分进位,若整数部分有进位,整数部分+1,小数部分变为00;若第一位小数部分有进位,正常输出保留两位小数;若第二位小数部分有进位,则整数部分不变,小数部分变为0.0的形式,最后调用递归函数将整数和小数两部分打印出来。
#include<iostream>
using namespace std;
void PrintDigit(int n)//递归打印数字
{
if(n>=10)
{
PrintDigit(n/10);
cout<<(n%10);
}
else
cout<<(n%10);
}
int main()
{
double a;//输入数字a
int c;//小数*100+0.5取整,确定是否进位
cout<<"Please input a number:";
cin>>a;
if(a<0)//判断该数是否为负数
{
a=-a;
putchar('-');
}
c=int((a-int(a))*100+0.50);
if(c/10==0) //若输入部分小数部分为0.0**,整数输出0,第一位小数输出0,第二位正常输出
{
PrintDigit(int(a));
cout<<'.';
PrintDigit(0);
PrintDigit(c);
cout<<endl;
}
else if(c/100==1)//若整数部分有进位,整数部分+1,小数部分变为00
{
PrintDigit(int(a)+1);
cout<<'.';
PrintDigit(0);
PrintDigit(0);
cout<<endl;
}
else //若无进位,则正常输出保留两位小数
{
PrintDigit(int(a));
cout<<'.';
PrintDigit(c);
cout<<endl;
}
}