笔试题练习(一)

1,请定义一个宏,比较两个数ab的大小,不能使用大于、小于、if语句

答:

#define  MAX(a,b) ((a-b)+abs(a-b)) ? a : b

a>b,则a-babs(a-b)均大于0,若a<b,a-babs(a-b)异号,则互相抵消,值为0,a==b,则无所谓,直接返回b

2,如何输出源文件的标题和目前执行行的行数

#include  < iostream >
using   namespace  std;

int  main()
{
    cout
<< " 源文件名称:  " << __FILE__ << endl;
    cout
<< " 当前行数:  " << __LINE__ << endl;
    
return   0 ;
}

3,两个数相加,小数点后位数没有限制,请写一个高精度算法

 

/**
 * 
 * 
@author  phinecos
 * 
@since  2009-05-19
 
*/
public   class  test 
{
    
private   static  String addFloatNum(String num1, String num2)
    {
// 两个浮点大数相加,小数点位数任意
        String result  =   "" ;
        
int  pos1,pos2,len1,len2;
        len1 
=  num1.length();
        len2 
=  num2.length();
        pos1 
=  num1.indexOf( ' . ' );
        pos2 
=  num2.indexOf( ' . ' );
        
// 分别剥离两个数的整数和小数部分
        String num1a  =  num1.substring( 0 , pos1);
        String num1b 
=  num1.substring(pos1 + 1 , len1);
        String num2a 
=  num2.substring( 0 , pos2);
        String num2b 
=  num2.substring(pos2 + 1 , len2);
        
// 整数部分相加
        String rsOne  =  add(num1a, num2a);
        
// 小数位对齐,不足的补0
         int  i,nZeroes,maxLen;
        maxLen 
=  (num1b.length() > num2b.length())  ?  num1b.length() : num2b.length();
        
if  (num1b.length() > num2b.length()) 
        {
// 第一个数的小数部分长,则第二个补不足的0
            nZeroes  =  num1b.length()  -  num2b.length(); // 待补的0的个数
             for  (i  =   0 ; i  <  nZeroes;  ++ i)
            {
                num2b 
+=   ' 0 ' ;
            }
        }
        
else   if (num2b.length()  >  num1b.length())
        {
// 第二个数的小数部分长,则第一个补不足的0
            nZeroes  =  num2b.length()  -  num1b.length(); // 待补的0的个数
             for  (i  =   0 ; i  <  nZeroes;  ++ i)
            {
                num1b 
+=   ' 0 ' ;
            }
        }
        
// 小数位对齐准备完毕,进行小数部分相加
        String rsTwo  =  add(num1b, num2b);
        
if  (rsTwo.length()  >  maxLen)
        {
// 说明有进位, 剥离第一位进位,加到整数部分去
             String nAddOn  =  rsTwo.substring( 0 , 1 );
             rsOne 
=  add(rsOne, nAddOn);
             rsTwo 
=  rsTwo.substring( 1 ,rsTwo.length());
        }
        
// 两部分结果拼凑起来
        StringBuilder sb  =   new  StringBuilder(rsOne);
        sb.append(
" . " );
        sb.append(rsTwo);
        result 
=  sb.toString();
        
return  result;
    }
    
private   static  String add(String num1, String num2)
    { 
// 大数相加
        String result  =   "" ;
        
int  len1  =  num1.length();
        
int  len2  =  num2.length();
        
int  nAddOn  =   0 ;
        
int  i,j,n1,n2,sum;
        StringBuilder sb 
=   new  StringBuilder();
        
for  (i  =  len1  -   1 ,j  =  len2  -   1  ; i  >=   0   &&  j  >=   0 -- i, -- j)
        {
            n1 
=  num1.charAt(i)  -   ' 0 ' ;
            n2 
=  num2.charAt(j)  -   ' 0 ' ;
            sum 
=  n1  +  n2  +  nAddOn;
            
            
if  (sum  >=   10 )
            {
                nAddOn 
=   1 ;
            }
            
else
            {
                nAddOn 
=   0 ;
            }
            sb.append(sum 
%   10 );
        }
        
if  (len1  >  len2)
        {
            
for  (; i  >=   0 -- i)
            {
                n1 
=  num1.charAt(i)  -   ' 0 ' ;
                sum 
=  n1  +  nAddOn;
                
if  (sum  >=   10 )
                {
                    nAddOn 
=   1 ;
                }
                
else
                {
                    nAddOn 
=   0 ;
                }
                sb.append(sum 
%   10 );
            }
        }
        
else   if  (len2  >  len1)
        {
            
for  (; j  >=   0 -- j)
            {
                n2 
=  num2.charAt(j)  -   ' 0 ' ;
                sum 
=  n2  +  nAddOn;
                
if  (sum  >=   10 )
                {
                    nAddOn 
=   1 ;
                }
                
else
                {
                    nAddOn 
=   0 ;
                }
                sb.append(sum 
%   10 );
            }
        }
        
        
if  (nAddOn  >   0 )
        {
            sb.append(nAddOn);
        }
        
        sb.reverse();
        result 
=  sb.toString();
        
return  result;
    }
    
public   static   void  main(String[] args)  throws  Exception
    {
        String num1 
=   " 13454354352454545454354354354354543.9999999999993545624524435245425435435435 " ;
        String num2 
=   " 3415545435435435435435435434525435245245454252.999999999999999994535435435435252245426 " ;
        String result 
=  addFloatNum(num1, num2); // 大浮点数相加
        System.out.println(result);
    }
}

4,对第3题做下修改,变成:两个数相乘,小数点后位数没有限制,请写一个高精度算法。

/**
 * 
 * 
@author  phinecos
 * 
@since  2009-05-19
 
*/
public   class  test 
{
    
private   static  String multipy(String num1, String num2)
    {
// 大数乘法
        String result  =   " 0 " ;
        
int  i,j,n1,n2;
        
int  len1  =  num1.length();
        
int  len2  =  num2.length();
        
if  (len1  <  len2)
        {
            
for  (i  =  len1  - 1 ; i  >= 0 -- i)
            {
                n1 
=  num1.charAt(i)  -   ' 0 ' ;
                String sum 
=   " 0 " ;
                
for  (j  =   0 ; j  <  n1;  ++ j)
                {
                    sum 
=  add(sum,num2);
                }
                StringBuilder tmpSB 
=   new  StringBuilder(sum);
                
for  (j  =  i; j  <  len1  - 1 ++ j)
                {
                    tmpSB.append(
" 0 " );
                }
                result 
=  add(result,tmpSB.toString());
            }
        }
        
else
        {
            
for  (i  =  len2  - 1 ; i  >= 0 -- i)
            {
                n2 
=  num2.charAt(i)  -   ' 0 ' ;
                String sum 
=   " 0 " ;
                
for  (j  =   0 ; j  <  n2;  ++ j)
                {
                    sum 
=  add(sum,num1);
                }
                StringBuilder tmpSB 
=   new  StringBuilder(sum);
                
for  (j  =  i; j  <  len2  - 1 ++ j)
                {
                    tmpSB.append(
" 0 " );
                }
                result 
=  add(result,tmpSB.toString());
            }
        }

        
return  result;
    }
    
private   static  String multipyFloatNum(String num1, String num2)
    {
// 两个浮点大数相乘
        String result  =   "" ;
        
int  pos1,pos2,len1,len2,nDot,posDot;
        len1 
=  num1.length();
        len2 
=  num2.length();
        
// 两个数的小数点位置
        pos1  =  num1.indexOf( ' . ' );
        pos2 
=  num2.indexOf( ' . ' );
        nDot 
=  (len1  -  pos1 - 1 +  (len2  -  pos2 - 1 ); // 乘积结果的小数位数
        
// 去掉两个数的小数点
        String num1a  =  num1.substring( 0 , pos1);
        String num1b 
=  num1.substring(pos1 + 1 , len1);
        String num2a 
=  num2.substring( 0 , pos2);
        String num2b 
=  num2.substring(pos2 + 1 , len2);
        num1 
=  num1a  +  num1b;
        num2 
=  num2a  +  num2b;
        
// 不带小数点进行大数相乘
        String rsTemp  =  multipy(num1, num2);
        
// 调整结果,加入小数点
        StringBuilder sb  =   new  StringBuilder(rsTemp);
        posDot 
=  sb.length()  -  nDot; // 小数点插入位置
        sb.insert(posDot,  ' . ' ); // 插入小数点
        result  =  sb.toString();
        
return  result;
    }
    
private   static  String add(String num1, String num2)
    {
// 两个大数相加
        String result  =   "" ;
        
int  len1  =  num1.length();
        
int  len2  =  num2.length();
        
int  nAddOn  =   0 ;
        
int  i,j,n1,n2,sum;
        StringBuilder sb 
=   new  StringBuilder();
        
for  (i  =  len1  -   1 ,j  =  len2  -   1  ; i  >=   0   &&  j  >=   0 -- i, -- j)
        {
            n1 
=  num1.charAt(i)  -   ' 0 ' ;
            n2 
=  num2.charAt(j)  -   ' 0 ' ;
            sum 
=  n1  +  n2  +  nAddOn;
            
            
if  (sum  >=   10 )
            {
                nAddOn 
=   1 ;
            }
            
else
            {
                nAddOn 
=   0 ;
            }
            sb.append(sum 
%   10 );
        }
        
if  (len1  >  len2)
        {
            
for  (; i  >=   0 -- i)
            {
                n1 
=  num1.charAt(i)  -   ' 0 ' ;
                sum 
=  n1  +  nAddOn;
                
if  (sum  >=   10 )
                {
                    nAddOn 
=   1 ;
                }
                
else
                {
                    nAddOn 
=   0 ;
                }
                sb.append(sum 
%   10 );
            }
        }
        
else   if  (len2  >  len1)
        {
            
for  (; j  >=   0 -- j)
            {
                n2 
=  num2.charAt(j)  -   ' 0 ' ;
                sum 
=  n2  +  nAddOn;
                
if  (sum  >=   10 )
                {
                    nAddOn 
=   1 ;
                }
                
else
                {
                    nAddOn 
=   0 ;
                }
                sb.append(sum 
%   10 );
            }
        }
        
        
if  (nAddOn  >   0 )
        {
            sb.append(nAddOn);
        }
        
        sb.reverse();
        result 
=  sb.toString();
        
return  result;
    }
    
public   static   void  main(String[] args)  throws  Exception
    {
        String num1 
=   " 12656436456456543.45874078765765765764542576756645745673467075 " ;
        String num2 
=   " 26546456654564564563.964006563565464654645565636543665635634565 " ;
        String result 
=  multipyFloatNum(num1, num2); // 大浮点数相加
        System.out.println(result);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值