天天看點

筆試題練習(一)

1,請定義一個宏,比較兩個數a、b的大小,不能使用大于、小于、if語句

答:

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

若a>b,則a-b和abs(a-b)均大于0,若a<b,則a-b和abs(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的個數

                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)

    { //大數相加

        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 (nAddOn > 0)

            sb.append(nAddOn);

        sb.reverse();

    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題做下修改,變成:兩個數相乘,小數點後位數沒有限制,請寫一個高精度算法。

    private static String multipy(String num1, String num2)

    {//大數乘法

        String result = "0";

        int i,j,n1,n2;

        if (len1 < len2)

            for (i = len1 -1; i >=0; --i)

                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';

                for (j = 0; j < n2; ++j)

                    sum = add(sum,num1);

                for (j = i; j < len2 -1; ++j)

    private static String multipyFloatNum(String num1, String num2)

    {//兩個浮點大數相乘

        int pos1,pos2,len1,len2,nDot,posDot;

        //兩個數的小數點位置

        nDot = (len1 - pos1-1) + (len2 - pos2-1);//乘積結果的小數位數

        //去掉兩個數的小數點

        num1 = num1a + num1b;

        num2 = num2a + num2b;

        //不帶小數點進行大數相乘

        String rsTemp = multipy(num1, num2);

        //調整結果,加入小數點

        StringBuilder sb = new StringBuilder(rsTemp);

        posDot = sb.length() - nDot;//小數點插入位置

        sb.insert(posDot, '.');//插入小數點

    {//兩個大數相加

        String num1 = "12656436456456543.45874078765765765764542576756645745673467075";

        String num2 = "26546456654564564563.964006563565464654645565636543665635634565";

        String result = multipyFloatNum(num1, num2);//大浮點數相加

本文轉自Phinecos(洞庭散人)部落格園部落格,原文連結:http://www.cnblogs.com/phinecos/archive/2009/05/19/1460290.html,如需轉載請自行聯系原作者

繼續閱讀