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

答:

  1. #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,如何输出源文件的标题和目前执行行的行数

  1. #include <iostream>  
  2. using namespace std;  
  3.  
  4. int main()  
  5. {  
  6.     cout<<"源文件名称: "<<__FILE__<<endl;  
  7.     cout<<"当前行数: "<<__LINE__<<endl;  
  8.     return 0;  
  9. }  

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

 

  1.    
  2.  
  3. /**  
  4.  *   
  5.  * @author phinecos  
  6.  * @since 2009-05-19  
  7.  */ 
  8. public class test   
  9. {  
  10.     private static String addFloatNum(String num1, String num2)  
  11.     {//两个浮点大数相加,小数点位数任意  
  12.         String result = "";  
  13.         int pos1,pos2,len1,len2;  
  14.         len1 = num1.length();  
  15.         len2 = num2.length();  
  16.         pos1 = num1.indexOf('.');  
  17.         pos2 = num2.indexOf('.');  
  18.         //分别剥离两个数的整数和小数部分  
  19.         String num1a = num1.substring(0, pos1);  
  20.         String num1b = num1.substring(pos1+1, len1);  
  21.         String num2a = num2.substring(0, pos2);  
  22.         String num2b = num2.substring(pos2+1, len2);  
  23.         //整数部分相加  
  24.         String rsOne = add(num1a, num2a);  
  25.         //小数位对齐,不足的补0  
  26.         int i,nZeroes,maxLen;  
  27.         maxLen = (num1b.length()>num2b.length()) ? num1b.length() : num2b.length();  
  28.         if (num1b.length()>num2b.length())   
  29.         {//第一个数的小数部分长,则第二个补不足的0  
  30.             nZeroes = num1b.length() - num2b.length();//待补的0的个数  
  31.             for (i = 0; i < nZeroes; ++i)  
  32.             {  
  33.                 num2b += '0';  
  34.             }  
  35.         }  
  36.         else if(num2b.length() > num1b.length())  
  37.         {//第二个数的小数部分长,则第一个补不足的0  
  38.             nZeroes = num2b.length() - num1b.length();//待补的0的个数  
  39.             for (i = 0; i < nZeroes; ++i)  
  40.             {  
  41.                 num1b += '0';  
  42.             }  
  43.         }  
  44.         //小数位对齐准备完毕,进行小数部分相加  
  45.         String rsTwo = add(num1b, num2b);  
  46.         if (rsTwo.length() > maxLen)  
  47.         {//说明有进位, 剥离第一位进位,加到整数部分去  
  48.              String nAddOn = rsTwo.substring(0,1);  
  49.              rsOne = add(rsOne, nAddOn);  
  50.              rsTwo = rsTwo.substring(1,rsTwo.length());  
  51.         }  
  52.         //两部分结果拼凑起来  
  53.         StringBuilder sb = new StringBuilder(rsOne);  
  54.         sb.append(".");  
  55.         sb.append(rsTwo);  
  56.         result = sb.toString();  
  57.         return result;  
  58.     }  
  59.     private static String add(String num1, String num2)  
  60.     { //大数相加  
  61.         String result = "";  
  62.         int len1 = num1.length();  
  63.         int len2 = num2.length();  
  64.         int nAddOn = 0;  
  65.         int i,j,n1,n2,sum;  
  66.         StringBuilder sb = new StringBuilder();  
  67.         for (i = len1 - 1,j = len2 - 1 ; i >= 0 && j >= 0; --i,--j)  
  68.         {  
  69.             n1 = num1.charAt(i) - '0';  
  70.             n2 = num2.charAt(j) - '0';  
  71.             sum = n1 + n2 + nAddOn;  
  72.               
  73.             if (sum >= 10)  
  74.             {  
  75.                 nAddOn = 1;  
  76.             }  
  77.             else 
  78.             {  
  79.                 nAddOn = 0;  
  80.             }  
  81.             sb.append(sum % 10);  
  82.         }  
  83.         if (len1 > len2)  
  84.         {  
  85.             for (; i >= 0; --i)  
  86.             {  
  87.                 n1 = num1.charAt(i) - '0';  
  88.                 sum = n1 + nAddOn;  
  89.                 if (sum >= 10)  
  90.                 {  
  91.                     nAddOn = 1;  
  92.                 }  
  93.                 else 
  94.                 {  
  95.                     nAddOn = 0;  
  96.                 }  
  97.                 sb.append(sum % 10);  
  98.             }  
  99.         }  
  100.         else if (len2 > len1)  
  101.         {  
  102.             for (; j >= 0; --j)  
  103.             {  
  104.                 n2 = num2.charAt(j) - '0';  
  105.                 sum = n2 + nAddOn;  
  106.                 if (sum >= 10)  
  107.                 {  
  108.                     nAddOn = 1;  
  109.                 }  
  110.                 else 
  111.                 {  
  112.                     nAddOn = 0;  
  113.                 }  
  114.                 sb.append(sum % 10);  
  115.             }  
  116.         }  
  117.           
  118.         if (nAddOn > 0)  
  119.         {  
  120.             sb.append(nAddOn);  
  121.         }  
  122.           
  123.         sb.reverse();  
  124.         result = sb.toString();  
  125.         return result;  
  126.     }  
  127.     public static void main(String[] args) throws Exception  
  128.     {  
  129.         String num1 = "13454354352454545454354354354354543.9999999999993545624524435245425435435435";  
  130.         String num2 = "3415545435435435435435435434525435245245454252.999999999999999994535435435435252245426";  
  131.         String result = addFloatNum(num1, num2);//大浮点数相加  
  132.         System.out.println(result);  
  133.     }  
  134. }  
 

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

  1. /**  
  2.  *   
  3.  * @author phinecos  
  4.  * @since 2009-05-19  
  5.  */ 
  6. public class test   
  7. {  
  8.     private static String multipy(String num1, String num2)  
  9.     {//大数乘法  
  10.         String result = "0";  
  11.         int i,j,n1,n2;  
  12.         int len1 = num1.length();  
  13.         int len2 = num2.length();  
  14.         if (len1 < len2)  
  15.         {  
  16.             for (i = len1 -1; i >=0; --i)  
  17.             {  
  18.                 n1 = num1.charAt(i) - '0';  
  19.                 String sum = "0";  
  20.                 for (j = 0; j < n1; ++j)  
  21.                 {  
  22.                     sum = add(sum,num2);  
  23.                 }  
  24.                 StringBuilder tmpSB = new StringBuilder(sum);  
  25.                 for (j = i; j < len1 -1; ++j)  
  26.                 {  
  27.                     tmpSB.append("0");  
  28.                 }  
  29.                 result = add(result,tmpSB.toString());  
  30.             }  
  31.         }  
  32.         else 
  33.         {  
  34.             for (i = len2 -1; i >=0; --i)  
  35.             {  
  36.                 n2 = num2.charAt(i) - '0';  
  37.                 String sum = "0";  
  38.                 for (j = 0; j < n2; ++j)  
  39.                 {  
  40.                     sum = add(sum,num1);  
  41.                 }  
  42.                 StringBuilder tmpSB = new StringBuilder(sum);  
  43.                 for (j = i; j < len2 -1; ++j)  
  44.                 {  
  45.                     tmpSB.append("0");  
  46.                 }  
  47.                 result = add(result,tmpSB.toString());  
  48.             }  
  49.         }  
  50.  
  51.         return result;  
  52.     }  
  53.     private static String multipyFloatNum(String num1, String num2)  
  54.     {//两个浮点大数相乘  
  55.         String result = "";  
  56.         int pos1,pos2,len1,len2,nDot,posDot;  
  57.         len1 = num1.length();  
  58.         len2 = num2.length();  
  59.         //两个数的小数点位置  
  60.         pos1 = num1.indexOf('.');  
  61.         pos2 = num2.indexOf('.');  
  62.         nDot = (len1 - pos1-1) + (len2 - pos2-1);//乘积结果的小数位数  
  63.         //去掉两个数的小数点  
  64.         String num1a = num1.substring(0, pos1);  
  65.         String num1b = num1.substring(pos1+1, len1);  
  66.         String num2a = num2.substring(0, pos2);  
  67.         String num2b = num2.substring(pos2+1, len2);  
  68.         num1 = num1a + num1b;  
  69.         num2 = num2a + num2b;  
  70.         //不带小数点进行大数相乘  
  71.         String rsTemp = multipy(num1, num2);  
  72.         //调整结果,加入小数点  
  73.         StringBuilder sb = new StringBuilder(rsTemp);  
  74.         posDot = sb.length() - nDot;//小数点插入位置  
  75.         sb.insert(posDot, '.');//插入小数点  
  76.         result = sb.toString();  
  77.         return result;  
  78.     }  
  79.     private static String add(String num1, String num2)  
  80.     {//两个大数相加  
  81.         String result = "";  
  82.         int len1 = num1.length();  
  83.         int len2 = num2.length();  
  84.         int nAddOn = 0;  
  85.         int i,j,n1,n2,sum;  
  86.         StringBuilder sb = new StringBuilder();  
  87.         for (i = len1 - 1,j = len2 - 1 ; i >= 0 && j >= 0; --i,--j)  
  88.         {  
  89.             n1 = num1.charAt(i) - '0';  
  90.             n2 = num2.charAt(j) - '0';  
  91.             sum = n1 + n2 + nAddOn;  
  92.               
  93.             if (sum >= 10)  
  94.             {  
  95.                 nAddOn = 1;  
  96.             }  
  97.             else 
  98.             {  
  99.                 nAddOn = 0;  
  100.             }  
  101.             sb.append(sum % 10);  
  102.         }  
  103.         if (len1 > len2)  
  104.         {  
  105.             for (; i >= 0; --i)  
  106.             {  
  107.                 n1 = num1.charAt(i) - '0';  
  108.                 sum = n1 + nAddOn;  
  109.                 if (sum >= 10)  
  110.                 {  
  111.                     nAddOn = 1;  
  112.                 }  
  113.                 else 
  114.                 {  
  115.                     nAddOn = 0;  
  116.                 }  
  117.                 sb.append(sum % 10);  
  118.             }  
  119.         }  
  120.         else if (len2 > len1)  
  121.         {  
  122.             for (; j >= 0; --j)  
  123.             {  
  124.                 n2 = num2.charAt(j) - '0';  
  125.                 sum = n2 + nAddOn;  
  126.                 if (sum >= 10)  
  127.                 {  
  128.                     nAddOn = 1;  
  129.                 }  
  130.                 else 
  131.                 {  
  132.                     nAddOn = 0;  
  133.                 }  
  134.                 sb.append(sum % 10);  
  135.             }  
  136.         }  
  137.           
  138.         if (nAddOn > 0)  
  139.         {  
  140.             sb.append(nAddOn);  
  141.         }  
  142.           
  143.         sb.reverse();  
  144.         result = sb.toString();  
  145.         return result;  
  146.     }  
  147.     public static void main(String[] args) throws Exception  
  148.     {  
  149.         String num1 = "12656436456456543.45874078765765765764542576756645745673467075";  
  150.         String num2 = "26546456654564564563.964006563565464654645565636543665635634565";  
  151.         String result = multipyFloatNum(num1, num2);//大浮点数相加  
  152.         System.out.println(result);  
  153.     }