久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5106|回復: 5
打印 上一主題 下一主題
收起左側

大整數(25000位)的四則運算C語言源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:166089 發表于 2018-7-2 10:43 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
研究密碼學過程中,遇到數據位比較長,c語言本身具有的數據類型無法滿足超長位數的整數進行四則運算,因此特意寫了這個程序。
參考了網上部分類似代碼,目前網上能找到的類似代碼,基本都有部分瑕疵,本文將我發現的瑕疵全部改進。
本文能實現25000位整數的加減乘除運算,經過本人的測試,基本正常。最大位數只驗證了4位,25000位未驗證。希望有興趣的黑友,幫忙下載測試,若發現問題,希望能在評論中提出,我將會及時改進,謝謝。
以下代碼在vc6.0中編譯運行通過,將下列代碼全部放于一個.c文件中即可。
關于程序細節方面,見下文的程序注釋。
  1. /**************************************************************
  2. *功能:實現大整數的加減乘除四則運算,最大位長為MAX-1,1為符號位
  3. *思路:利用數組實現,盡量將四則運算封裝成函數;
  4. *     1.開始菜單;數組初始化,避免影響第二次運算結果接收數據;提示信息
  5. *     2.接收數據
  6. *     3.先判斷進行哪種運算(加減乘除退出),再判斷輸入的兩個數據是否為0
  7. *      (加減時,若ab都為0,則直接輸出結果0;乘時,則ab任一為0,則直接輸出結果0;
  8. *       除時,b為0,則輸出提示“輸入錯誤”,b不為0a為0,則直接輸出結果0);
  9. *     4.再判斷a和b的符號
  10. *       加時:同號相加則調加;+-相加則將-變+再調減;-+相加,將-變+,再調換成+-,再調減
  11. *       減時:++相減則調減;+-相減則將-變+再調加;-+相減則將+變-再調加;--相減,將-變+再交換ab值,再調減
  12. *       乘時:異號相乘結果添'-'號,同號相乘不處理;ab符號皆調正,子函數不處理符號位
  13. *       除時:異號相除結果添'-'號,同號相乘不處理;ab符號皆調正,子函數不處理符號位;若有小數則,則用余數形式顯示。
  14. *     5.調用子函數處理數據
  15. *     5.輸出結果
  16. *注意!!:數組定義大小要注意,計算結果有的比最大位數大1,有的大2倍+1;
  17. *       因內存限制了數組下標,MAX最大值為25001,本程序運行正常;超出此值,程序運行將出現問題!!!
  18. *測試數據:加法:0+0=0;0+5=5;5+0=5;5+5=10;5+(-8)=-3;(-8)+5=-3;(-5)+(-5)=-10
  19. *               11+12=23;11+123=134;123+11=134; -11+12=1;-11+123=112;-123+11=-112
  20. *               80848+36678623=36759471;-2998602+(-44953)=-3043555;-8+39639213=39639205
  21. *         減法:0-0=0;0-5=-5;5-0=5;5-5=0;5-(-8)=13;(-8)-5=-13;(-5)-(-5)=0
  22. *               11-12=-1;11-123=-112;123-11=112; -11-12=-23;-11-123=-134;-123-11=-134;
  23. *               -5429891960-(5838364)=-5435730324;5039-(-41490954)=41495993
  24. *         乘法:0*0=0;0*5=0;5*0=0;5*5=25;5*(-8)=-40;(-8)*5=-40;(-5)*(-5)=25
  25. *                                11*12=132;11*123=1353;123*11=1353; -11*12=-132;-11*123=-1353;-123*11=-1353;
  26. *               -49*(-128)=6272   4268*13197386=56326443448
  27. *         除法:0/0=--;0/5=0;5/0=--;5/5=1;5/(-8)=-0……5;(-8)/5=-1……3;(-5)/(-5)=1
  28. *               11/12=0……11;11/123=0……11;123/11=11……2; -11/12=-0……11;-11/123=-0……11;-123/11=-11……2;
  29. *               043714/956540=0(輸入數據不規范)默認數據最高位非0
  30. *               7425776/338=21969……254
  31. *               8784015415/3545=2477860……1715
  32. *         將#define MAX 25001  改為  #define MAX 5;再將a=b=9999,分別進行加減乘除,結果分別為19998、0、99980001、1
  33. *         驗證最大位數計算正確與否                 再將a=b=-9999,分別進行加減乘除,結果分別為-19998、0、99980001、1
  34. *         驗證結束后,根據實際情況,改其值         再將a=9999,b=-9999,分別進行加減乘除,結果分別為0、19998、-99980001、-1
  35. *                                                  再將a=-9999,b=9999,分別進行加減乘除,結果分別為0、-19998、-99980001、-1
  36. **************************************************************/

  37. #include <stdio.h>
  38. #define MAX 25001    // 大數的最大位數,包括一位符號位,實際數字位數為MAX-1

  39. /*****************************************
  40. *功能說明:打印菜單函數
  41. *          僅提示用戶選擇何種運算
  42. *          不接收不判斷數據
  43. *****************************************/
  44. void menu()  //菜單
  45. {        
  46.         printf("===============大整數(最大數字位數25000位)計算器==================\n");
  47.         printf("1.加法 2.減法 3.乘法 4.除法 0.退出\n");
  48.         printf("請從0~4中選擇:");
  49. }

  50. /*****************************************
  51. *功能說明: 讀入所要計算的數值,數據初始化
  52. *參數說明: a[]第一個數值, b[]第二個數值
  53. *          *p1第一個數值長度(包括符號位)
  54. *          *p2第二個數值長度(包括符號位)
  55. *其他說明: 參數傳遞都采用傳地址的方式,
  56. *          調用本函數前,需要提前定義好相關變量  
  57. *          數組存儲數據為大端方式:
  58. *          即:數值-12在數組中的下標依次為0,1,2
  59. *          數組第0位為符號位,0為正,非0為負
  60. *****************************************/
  61. void init(int a[], int b[], int *p1, int *p2)  // 輸入
  62. {
  63.         int i,j;
  64.         char r,s;
  65.         for(i=0;i<MAX;i++)  // 數組清零,以確保第二次之后的運行結果不受影響
  66.         {
  67.                 a[i]=0;
  68.                 b[i]=0;
  69.         }
  70.         printf("請輸入(0123456789+-)中的任意字符\n請輸入第一個(a)數值:");  // 默認輸入正確,不進行判斷
  71.         r=getchar();
  72.         if(r=='-')   // "-" 輸入負數
  73.         {
  74.                 a[0]=r;
  75.                 for(i=1;(r=getchar())!='\n';i++)
  76.                         a[i]=r-48;
  77.         }
  78.         else  // 輸入正數
  79.         {
  80.                 a[1]=r-48;
  81.                 for(i=2;(r=getchar())!='\n';i++)
  82.                         a[i]=r-48;
  83.         }
  84.         *p1=i;
  85.         
  86.         printf("請輸入第二個(b)數值:"); // 默認輸入正確,不進行判斷
  87.         s=getchar();
  88.         if(s=='-')  
  89.         {
  90.                 b[0]=s;
  91.                 for(j=1;(s=getchar())!='\n';j++)
  92.                         b[j]=s-48;
  93.         }
  94.         else  
  95.         {
  96.                 b[1]=s-48;
  97.                 for(j=2;(s=getchar())!='\n';j++)
  98.                         b[j]=s-48;
  99.         }
  100.         *p2=j;
  101. }

  102. /*****************************************
  103. *功能說明: 兩個同號整數相加(++、--)
  104. *參數說明: a[]第一個數值, b[]第二個數值
  105. *          c[]第一二數值相加的結果
  106. *          返回值i為c[]數組的長度,即結果的實際長度
  107. *          m第一個數值長度(包括符號位)
  108. *          n第二個數值長度(包括符號位)
  109. *其他說明: 數組參數傳遞采用傳地址的方式,
  110. *          調用本函數前,需要提前定義好相關變量
  111. *          a[],b[],c[]數組存儲數據為大端方式:
  112. *          即:數值-12在數組中的下標依次為0,1,2
  113. *                   d[]數組存儲數據為小端方式:
  114. *          即:數值-12在數組中的下標依次為2,1,0
  115. *****************************************/
  116. int plus(int a[], int b[], int c[], int m, int n)  //加法運算
  117. {        
  118.         int d[MAX+1]={0},i,j,k;   // 和比最大位數可能長1位
  119.         if(a[1]==0)   // 處理a+b時,有a為0的情況
  120.         {
  121.                 for(i=0;i<n;i++)
  122.                         c[i]=b[i];
  123.                 return(i);
  124.         }
  125.         if(b[1]==0)  // 處理a+b時,有b為0的情況
  126.         {
  127.                 for(i=0;i<m;i++)
  128.                         c[i]=a[i];
  129.                 return(i);
  130.         }
  131.         
  132.         for(i=m-1,j=n-1,k=1;i>0&&j>0;i--,j--,k++)  // 處理a+b時,有a,b都不為0的情況
  133.         {
  134.                 d[k]=a[i]+b[j]+d[k];
  135.                 if(d[k]>9)  // 處理和進位的情況
  136.                 {
  137.                         d[k+1]=1;
  138.                         d[k]=d[k]-10;
  139.                 }
  140.         }
  141.         while(i>0)  // 處理a+b時, a長度>b長度的情況
  142.         {
  143.                 d[k]=d[k]+a[i];
  144.                 if(d[k]>9)  
  145.                 {
  146.                         d[k+1]=1;
  147.                         d[k]=d[k]-10;
  148.                 }
  149.                 k++;                 
  150.                 i--;
  151.         }  
  152.         while(j>0) // 處理a+b時, a長度<b長度的情況
  153.         {
  154.                 d[k]=d[k]+b[j];
  155.                 if(d[k]>9)  
  156.                 {
  157.                         d[k+1]=1;
  158.                         d[k]=d[k]-10;
  159.                 }
  160.                 k++;
  161.                 j--;
  162.         }
  163.         d[0]=a[0]+b[0];
  164.         c[0]=d[0];
  165.         if(d[k]==0) // 數值和最高位沒有進位
  166.                 k--;
  167.         for(i=1;k>0;i++,k--)
  168.                 c[i]=d[k];
  169.         return(i);
  170. }

  171. /*****************************************
  172. *功能說明: 兩個正整數相減 (++)
  173. *參數說明: a[]第一個數值, b[]第二個數值
  174. *          c[]第一二數值相減的結果
  175. *          返回值i為d[]數組的長度,即結果的實際長度
  176. *          m第一個數值長度(包括符號位)
  177. *          n第二個數值長度(包括符號位)
  178. *其他說明: 數組參數傳遞采用傳地址的方式,
  179. *          調用本函數前,需要提前定義好相關變量
  180. *          a[],b[],c[]數組存儲數據為大端方式:
  181. *          即:數值-12在數組中的下標依次為0,1,2
  182. *                   d[]數組存儲數據為小端方式:
  183. *          即:數值-12在數組中的下標依次為2,1,0
  184. *****************************************/
  185. int minus(int a[], int b[], int c[], int m, int n) //減法運算
  186. {
  187.         int d[MAX+1]={0},i,j,k,T;  // 多一位可能存在的借位位
  188.         
  189.         if (m<n) // a<b 位
  190.         {
  191. a:                T=m;
  192.                 m=n;
  193.                 n=T;
  194.                 for(i=m-1,j=n-1,k=1;i>0&&j>0;i--,j--,k++)  
  195.                 {
  196.                         if(d[k]<0||b[i]<a[j]) // 有借位情況
  197.                         {
  198.                                 d[k]=d[k]+b[i]-a[j];
  199.                                 if(d[k]<0)
  200.                                 {
  201.                                         d[k]+=10;
  202.                                         d[k+1]=-1;
  203.                                 }
  204.                         }
  205.                         else  // 無借位情況
  206.                                 d[k]=b[i]-a[j];
  207.                 }
  208.                 while(i>0)  
  209.                 {
  210.                         d[k]=d[k]+b[i];
  211.                         if(d[k]<0)  
  212.                         {
  213.                                 d[k]+=10;
  214.                                 d[k+1]--;
  215.                         }
  216.                         k++;
  217.                         i--;
  218.                 }
  219.                 d[k]=b[i]+d[k];                 
  220.                 while(d[k]<=0&&k>0)  
  221.                         k--;
  222.                 for(i=1;k>0;i++)  
  223.                         c[i]=d[k--];
  224.                 c[0]=45;
  225.                 return(i);
  226.         }
  227.         if(m>n)  // a>b 位
  228.         {               
  229. b:                for(i=m-1,j=n-1,k=1;i>0&&j>0;i--,j--,k++)  
  230.                 {
  231.                         if(d[k]<0||a[i]<b[j]) // 有借位情況
  232.                         {
  233.                                 d[k]=d[k]+a[i]-b[j];
  234.                                 if(d[k]<0)
  235.                                 {
  236.                                         d[k]+=10;
  237.                                         d[k+1]=-1;
  238.                                 }
  239.                         }
  240.                         else  // 無借位情況
  241.                                 d[k]=a[i]-b[j];
  242.                 }
  243.                 while(i>0)  
  244.                 {
  245.                         d[k]=d[k]+a[i];
  246.                         if(d[k]<0)  
  247.                         {
  248.                                 d[k]+=10;
  249.                                 d[k+1]--;
  250.                         }
  251.                         k++;
  252.                         i--;
  253.                 }
  254.                 d[k]=a[i]+d[k];
  255.                
  256.                 while(d[k]<=0&&k>0)  
  257.                         k--;
  258.                 for(i=1;k>0;i++)  
  259.                         c[i]=d[k--];
  260.                 return(i);
  261.         }
  262.         // a==b 位數
  263.         {
  264.                 for(i=1; i<m; i++)
  265.                 {
  266.                         if(a[i]>b[i])  // a>b 數值
  267.                                 goto b;
  268.                         else if(a[i]<b[i]) // a<b 數值
  269.                                 goto a;
  270.                 }
  271.                 c[0]=0; //a=b
  272.                 c[1]=0;
  273.                 return 2;
  274.         }
  275. }

  276. /*****************************************
  277. *功能說明: 兩個整數相乘
  278. *注:函數運算過程中未處理符號
  279. *參數說明: a[]第一個數值, b[]第二個數值
  280. *          c[]第一二數值相乘的結果
  281. *          返回值k為c[]數組的長度,即結果的實際長度(包括符號位)
  282. *          m第一個數值長度(包括符號位)
  283. *          n第二個數值長度(包括符號位)
  284. *其他說明: 數組參數傳遞采用傳地址的方式,
  285. *          調用本函數前,需要提前定義好相關變量
  286. *          a[],b[],c[]數組存儲數據為大端方式:
  287. *          即:數值-12在數組中的下標依次為0,1,2
  288. *                   d[]數組存儲數據為小端方式:
  289. *          即:數值-12在數組中的下標依次為2,1,0
  290. *★ Comba 乘法 (Comba  Multiplication)原理實現
  291. *        Comba 乘法以(在密碼學方面)不太出名的 Paul G. Comba 得名。
  292. *        和普通的筆算乘法很類似,只是每一次單精度乘法只是單純計算乘法,不計算進位,進位留到每一列累加后進行。
  293. *        Comba 乘法無需進行嵌套進位來計算乘法,時間復雜度和基線乘法一樣
  294. *        Comba 乘法則按列計算,先累加,然后傳遞進位,減少了計算量,所以速度快。
  295. ************************************************************/
  296. int multi(int a[], int b[], int c[], int m, int n)  //正整數乘法運算
  297. {        
  298.         int d[2*MAX+1]={0},i,j,k,s;
  299.         for(i=0;i<MAX;i++)
  300.                 c[i]=0;
  301.         if(m<=n)  // a位數大于等于b位數
  302.         {
  303.                 for(i=m-1,s=1;i>0;i--,s++)         // 單純計算乘法,不計算進位               
  304.                 {
  305.                         for(j=n-1,k=1*s;j>0;j--,k++)
  306.                         {
  307.                                 d[k]=a[i]*b[j]+d[k];
  308.                         }
  309.                 }               
  310.                 for(i=1;i<k;i++)   // 處理進位                        
  311.                 {
  312.                         if(d[i]>9)
  313.                         {
  314.                                 d[i+1]=d[i+1]+d[i]/10;
  315.                                 d[i] = d[i]%10;
  316.                         }
  317.                 }
  318.                 if(d[i]==0) // 數值和最高位沒有進位
  319.                         i--;
  320.                 for(k=1;i>0;k++,i--)
  321.                         c[k]=d[i];
  322.                 return k;
  323.         }
  324.         else  // a位數大于b位數
  325.         {
  326.                 for(i=n-1,s=1;i>0;i--,s++)         // 單純計算乘法,不計算進位               
  327.                 {
  328.                         for(j=m-1,k=1*s;j>0;j--,k++)
  329.                         {
  330.                                 d[k]=b[i]*a[j]+d[k];
  331.                         }
  332.                 }
  333.                 // 處理進位
  334.                 for(i=1;i<k;i++)                        
  335.                 {
  336.                         if(d[i]>9)
  337.                         {
  338.                                 d[i+1]=d[i+1]+d[i]/10;
  339.                                 d[i] = d[i]%10;
  340.                         }
  341.                 }
  342.                 if(d[i]==0) // 數值和最高位沒有進位
  343.                         i--;
  344.                 for(k=1;i>0;k++,i--)
  345.                         c[k]=d[i];
  346.                 return k;
  347.         }
  348. }

  349. /*****************************************
  350. *功能說明: 用長度為len1的大整數p1減去長度為len2的大整數p2
  351. *          結果存在p1中,返回值代表結果的長度
  352. *          不夠減:返回-1 , 正好夠:返回0
  353. *數組數值為:p1,p2小端
  354. *其他說明: 數組參數傳遞采用傳地址的方式,
  355. *          調用本函數前,需要提前定義好相關變量
  356. *          本函數的作用僅與Division函數結合實現除法
  357. *****************************************/
  358. int SubStract(int *p1, int len1, int *p2, int len2)
  359. {
  360.         int i;
  361.         if(len1 < len2)
  362.                 return -1;
  363.         if(len1 == len2 )
  364.         {                        // 判斷p1 > p2
  365.                 for(i = len1-1; i >= 0; i--)
  366.                 {
  367.                         if(p1[i] > p2[i])   // 若大,則滿足條件,可做減法
  368.                                 break;
  369.                         else if(p1[i] < p2[i]) // 否則返回-1
  370.                                 return -1;
  371.                 }
  372.         }
  373.         for(i = 0; i <= len1-1; i++)  // 從低位開始做減法
  374.         {
  375.                 p1[i] -= p2[i];         // 相減
  376.                 if(p1[i] < 0)           // 若是否需要借位
  377.                 {   // 借位
  378.                         p1[i] += 10;
  379.                         p1[i+1]--;
  380.                 }
  381.         }
  382.         for(i = len1-1; i >= 0; i--)  // 查找結果的最高位
  383.         {
  384.                 if( p1[i] )             //最高位第一個不為0
  385.                         return (i+1);       //得到位數并返回
  386.         }
  387.         return 0;                   //兩數相等的時候返回0
  388. }

  389. /*****************************************
  390. *功能說明: 大數除法---結果不包括小數點
  391. **注:函數運算過程中未處理符號
  392. *參數說明: a[]被除數  b[]除數
  393. *          c[]第一二數值相除的結果即:a/b=c
  394. *          返回值len為c[]數組的長度,即結果的實際長度
  395. *          m第一個數值長度(包括符號位)
  396. *          n第二個數值長度(包括符號位)
  397. *          *p表示余數的位數,位數大于0時,表示有余數;否則無余數
  398. *          num_a[]保存最后余數的
  399. *其他說明: 數組參數傳遞采用傳地址的方式,
  400. *          調用本函數前,需要提前定義好相關變量
  401. *          a[],b[],c[],num_a[]數組存儲數據為大端方式:
  402. *          即:數值-12在數組中的下標依次為0,1,2
  403. *****************************************/
  404. int Division(int a[], int b[], int c[] , int m, int n, int *p, int num_a[])
  405. {
  406.         int i, j;
  407.         int len=0;
  408.         int nTimes;                //兩大數相差位數
  409.         int nTemp;                 //Subtract函數返回值
  410.         int num_b[MAX] = {0};      //除數
  411.         int num_c[MAX+1] = {0};      //商         
  412.         if( m < n )          //如果被除數小于除數,直接返回-1,表示結果為0……a
  413.         {
  414.                 return -1;
  415.         }        
  416.         if(m==n)
  417.         {
  418.                 for(i=1; i<m; i++)                        
  419.                 {
  420.                         if(a[i]>b[i]) // 夠減一次否
  421.                                 break;
  422.                 }
  423.                 if(i==m && a[m-1]<b[m-1]) // 包含符號位
  424.                         return -1;  // 如果被除數小于除數,直接返回-1,表示結果為0……a
  425.                
  426.         }
  427.         nTimes = m - n;    //相差位數        
  428.         //翻轉保存的數據
  429.         for( j = 1, i = m-1; i >= 0; j++, i-- )
  430.                 num_a[j] = a[i];
  431.         for( j = 1, i = n-1; i >= 0; j++, i-- )
  432.                 num_b[j] = b[i];
  433.         
  434.         for ( i=m-1; i>=0; i-- )    //將除數擴大,使得除數和被除數位數相等
  435.         {
  436.                 if ( i>=nTimes )
  437.                         num_b[i] = num_b[i-nTimes];
  438.                 else                     //低位置0
  439.                         num_b[i] = 0;
  440.         }
  441.         n=m;
  442.         
  443.         for( j=0; j<=nTimes; j++ )      //重復調用,同時記錄減成功的次數,即為商
  444.         {
  445.                 while((nTemp = SubStract(num_a,m,num_b + j,n - j)) >= 0)
  446.                 {
  447.                         m = nTemp;      //結果長度
  448.                         num_c[nTimes-j]++;//每成功減一次,將商的相應位加1
  449.                 }
  450.         }        
  451.         if(nTemp<0)
  452.                 *p=m; // 有余數
  453.         else
  454.                 *p=0; //無余數
  455.         
  456.         // 計算商的位數,并將商放在c數組中
  457.         for(i = MAX-1; num_c[i] == 0 && i >= 0; i-- );  //跳過高位0,獲取商的位數
  458.         if(i >= 0)
  459.                 len = i + 1; // 保存位數
  460.         for(j = 1; i >= 0; i--, j++)     // 將結果復制到c數組中
  461.         {
  462.                 c[j] = num_c[i];
  463.         }
  464.         return len+1;      // 返回商的位數
  465. }

  466. //功能說明:主函數,調用其余函數,計算相應功能的值并輸出
  467. int main()
  468. {        
  469.     //積的位數最多是因數位數的兩倍
  470.         int a[MAX]={0}, b[MAX]={0}, c[2*MAX+1]={0}, Temp[MAX]={0};
  471.         int m,n;
  472.         int *p1,*p2;         
  473.         int i, j;
  474.         int select;
  475.         int len;
  476.         int remainder;        
  477.         p1=&m;
  478.         p2=&n;        
  479.         while(1)
  480.         {
  481.                 for(i=0;i<MAX;i++) // 初始化0,避免影響下一次運行
  482.                 {
  483.                         a[i]=0;
  484.                         b[i]=0;
  485.                         c[i]=0;
  486.                         Temp[i]=0;
  487.                 }
  488.                 for(;i<2*MAX+2;i++) // 初始化0,避免影響下一次運行
  489.                 {
  490.                         c[i]=0;
  491.                 }
  492.                 menu();    // 僅輸出提示信息
  493.                 select=getchar(); // 獲得四則運算中的一個(1加2減3乘4除0退出)
  494.                 getchar();  // 處理選擇時候的回車,避免第二次運行無法重新選擇0~4
  495.                 if(select =='0')
  496.                         return 0;  // 退出程序
  497.                 else if(!(select>'0'&&select<'5'))        
  498.                 {
  499.                         printf("輸入錯誤!\n請從0~4中選擇一個數輸入!!\n\n");
  500.                         continue;
  501.                 }
  502.                 init(a,b,p1,p2);  //  獲取兩個數值
  503.                 switch(select)
  504.                 {                 
  505.                 case '1':
  506.                         {
  507.                                 if(a[1]==0&&b[1]==0) // 兩0相加
  508.                                 {
  509.                                         printf("a+b=0\n\n");  
  510.                                         break;
  511.                                 }
  512.                                 printf("a+b=");                 
  513.                                 if(a[0]==b[0]) // 同號相加則調加
  514.                                 {
  515.                                         j=plus(a, b, c, m, n);  //加法運算
  516.                                         if(c[0]!=0)  
  517.                                                 printf("-");
  518.                                         for(i=1;i<j;i++)
  519.                                                 printf("%d",c[i]);
  520.                                         printf("\n\n");
  521.                                         break;
  522.                                 }
  523.                                 if(a[0]==0 && b[0]!=0) // +-相加則將-變+再調減
  524.                                 {
  525.                                         b[0]=0; // 將b的符號變為+
  526.                                         j=minus(a, b, c, m, n); //減法運算
  527.                                         if(c[0]!=0)  
  528.                                                 printf("-");
  529.                                         for(i=1;i<j;i++)
  530.                                                 printf("%d",c[i]);
  531.                                         printf("\n\n");
  532.                                         break;
  533.                                 }
  534.                                 // -+相加,將-變+,再調換成+-,再調減
  535.                                 {
  536.                                         a[0]=0; // 將-變+
  537.                                         // 交換a,b數值
  538.                                         for(i=1; i<(m>n?m:n); i++)
  539.                                         {
  540.                                                 Temp[i]=a[i];
  541.                                                 a[i]=b[i];
  542.                                                 b[i]=Temp[i];
  543.                                         }
  544.                                         // 交換a,b位數
  545.                                         i=m;
  546.                                         m=n;
  547.                                         n=i;
  548.                                         j=minus(a, b, c, m, n); //減法運算
  549.                                         if(c[0]!=0)  
  550.                                                 printf("-");
  551.                                         for(i=1;i<j;i++)
  552.                                                 printf("%d",c[i]);
  553.                                         printf("\n\n");
  554.                                         break;                                         
  555.                                 }
  556.                         }               
  557.                 case '2':
  558.                         {
  559.                                 if(a[1]==0&&b[1]==0) // 兩0相減
  560.                                 {
  561.                                         printf("a-b=0\n\n");  
  562.                                         break;
  563.                                 }
  564.                                 printf("a-b=");
  565.                                 if(a[0]==0&&b[0]==0) // ++相減則調減
  566.                                 {
  567.                                         j=minus(a, b, c, m, n); //減法運算
  568.                                         if(c[0]!=0)  
  569.                                                 printf("-");
  570.                                         for(i=1;i<j;i++)
  571.                                                 printf("%d",c[i]);
  572.                                         printf("\n\n");
  573.                                         break;
  574.                                 }
  575.                                 if(a[0]==0&&b[0]!=0) // +-相減則將-變+再調加
  576.                                 {
  577.                                         b[0]=0; // 將b的符號變為+
  578.                                         j=plus(a, b, c, m, n);  //加法運算  
  579.                                         if(c[0]!=0)  
  580.                                                 printf("-");
  581.                                         for(i=1;i<j;i++)
  582.                                                 printf("%d",c[i]);
  583.                                         printf("\n\n");
  584.                                         break;
  585.                                 }
  586.                                 if(a[0]!=0&&b[0]==0)   // -+相減則將+變-再調加
  587.                                 {
  588.                                         b[0]='-'; // 將b的符號變為-
  589.                                         j=plus(a, b, c, m, n);  //加法運算
  590.                                         if(c[0]!=0)  
  591.                                                 printf("-");
  592.                                         for(i=1;i<j;i++)
  593.                                                 printf("%d",c[i]);
  594.                                         printf("\n\n");
  595.                                         break;
  596.                                 }
  597.                                 // --相減,將-變+再交換ab值,再調減
  598.                                 {
  599.                                         a[0]=0; // 將-變+
  600.                                         b[0]=0;
  601.                                         // 交換a,b數值
  602.                                         for(i=1; i<(m>n?m:n); i++)
  603.                                         {
  604.                                                 Temp[i]=a[i];
  605.                                                 a[i]=b[i];
  606.                                                 b[i]=Temp[i];
  607.                                         }
  608.                                         // 交換a,b位數
  609.                                         i=m;
  610.                                         m=n;
  611.                                         n=i;               
  612.                                         j=minus(a, b, c, m, n); //減法運算
  613.                                         if(c[0]!=0)  
  614.                                                 printf("-");
  615.                                         for(i=1;i<j;i++)
  616.                                                 printf("%d",c[i]);
  617.                                         printf("\n\n");
  618.                                         break;
  619.                                 }
  620.                         }                        
  621.                 case '3':
  622.                         {
  623.                                 if(a[1]==0||b[1]==0) // 任意個0相乘
  624.                                 {
  625.                                         printf("a*b=0\n\n");  
  626.                                         break;
  627.                                 }
  628.                                 printf("a*b=");
  629.                                 if((a[0]==0&&b[0]!=0)||(a[0]!=0&&b[0]==0)) // 異號相乘結果添'-'號,ab符號設為+,運算中符號不起作用
  630.                                         printf("-");
  631.                                 a[0]=0;
  632.                                 b[0]=0;
  633.                                 j=multi(a, b, c, m, n);  //正整數乘法運算
  634.                                 for(i=1;i<j;i++)
  635.                                         printf("%d",c[i]);
  636.                                 printf("\n\n");
  637.                                 break;
  638.                         }                        
  639.                 case '4':
  640.                         {
  641.                                 if(b[1]==0) // 除數為0
  642.                                 {
  643.                                         printf("輸入錯誤!!\n除數不能為0!!!\n\n");  
  644.                                         break;
  645.                                 }
  646.                                 else if(a[1]==0) //被除數為0
  647.                                 {
  648.                                         printf("a÷b=0\n\n");
  649.                                         break;
  650.                                 }
  651.                                 printf("a÷b=");
  652.                                 if((a[0]==0&&b[0]!=0)||(a[0]!=0&&b[0]==0)) // 異號相除結果添'-'號,ab符號設為+,運算中符號不起作用
  653.                                         printf("-");
  654.                                 len = Division(a, b, c, m, n, &remainder, Temp);
  655.                                 //輸出結果
  656.                                 if( len>0 )
  657.                                 {
  658.                                         for(i = 1; i < len; i++ )                                       
  659.                                                 printf("%d", c[i]);
  660.                                         if(remainder>0) // 有余數,輸出余數
  661.                                         {
  662.                                                 printf("……");
  663.                                                 for(i=remainder-1; i>0; i--)
  664.                                                         printf("%d", Temp[i]);
  665.                                         }                                       
  666.                                 }
  667.                                 else
  668.                                 {
  669.                                         printf("0……");
  670.                                         for(i = 1; i < m; i++ )                                       
  671.                                                 printf("%d", a[i]);
  672.                                 }
  673.                                 printf("\n\n");        
  674.                                 break;
  675.                         }
  676.                 }
  677.         }
  678.         return 0;
  679. }
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

6#
ID:166089 發表于 2019-6-26 09:13 | 只看該作者
君任知命 發表于 2019-6-25 13:39
請問單片機該如何做大數運算?

你可以試試把這個程序移植進去,把最大位數先設置為10以下的進行測試,等該程序移植測試成功后,再把最大位數往上調。這個程序,除了輸入輸出函數和最大位數以外,其他的應該是與單片機內的程序無差別。
回復

使用道具 舉報

5#
ID:571663 發表于 2019-6-25 13:40 | 只看該作者
請問單片機該怎么進行大數運算?
回復

使用道具 舉報

地板
ID:571663 發表于 2019-6-25 13:39 | 只看該作者
請問單片機該如何做大數運算?
回復

使用道具 舉報

板凳
ID:364211 發表于 2018-7-3 18:03 | 只看該作者
666666

評分

參與人數 1黑幣 +5 收起 理由
啦啦啦一博 + 5

查看全部評分

回復

使用道具 舉報

沙發
ID:1 發表于 2018-7-3 03:16 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美中文一区 | 欧美国产精品一区二区三区 | 欧美精品一区二区在线观看 | 成人欧美一区二区三区1314 | 久色网| 久久精品一 | 91av视频在线观看 | 国产精品国产三级国产aⅴ原创 | 日韩黄| 国产a一区二区 | 一区二区三区四区国产 | 91麻豆精品国产91久久久更新资源速度超快 | 三级特黄特色视频 | 久久精品中文字幕 | 黄色大片毛片 | 欧美一卡二卡在线 | 国产精品明星裸体写真集 | 九九热免费在线观看 | 精品国产乱码久久久久久蜜退臀 | 精品一区二区三区在线播放 | 成人在线视频免费观看 | 亚洲电影一级片 | 成人免费观看男女羞羞视频 | 成人一区二区三区在线观看 | 国产精品区二区三区日本 | 精品欧美一区二区三区 | 三级av在线 | 亚洲福利在线视频 | 日本天天操 | 精品一区二区久久久久久久网站 | 成在线人视频免费视频 | 精品中文字幕一区 | 精品国产乱码一区二区三 | 欧美 日韩 综合 | 国产精品成人一区二区三区夜夜夜 | 久久夜视频 | 国产精品毛片一区二区三区 | 国产成人99久久亚洲综合精品 | 午夜精品一区二区三区三上悠亚 | 91精品国产综合久久精品 | 久精品久久 |