大數相除c語言,c語言小數除大數

本文目錄一覽:

c語言大數除法算法

#include stdio.h

#include string.h

#define MAXSIZE 1025

void Div(char *str1, char *str2, char *str3)

{

int i1, i2, i, j, jj, tag, carry, cf, c[MAXSIZE];

int len1 = strlen(str1), len2 = strlen(str2), lend;

char d[MAXSIZE];

memset(c, 0, sizeof(c));

memcpy(d, str1, len2);

lend = len2; j = 0;

for( i1=len2-1; i1 len1; ++i1 )

{

if( lend len2 )

{

d[lend] = str1[i1+1]; c[j] = 0;

++j; ++lend;

}

else

if( lend == len2 )

{

jj = 1;

for( i=0; i lend; ++i )

{

if( d[i] str2[i] ) break;

else if( d[i] str2[i] )

{

jj = 0; break;

}

}

if( jj == 0 )

{

d[lend] = str1[i1+1]; c[j] = 0;

++j; ++lend;

continue;

}

}

if( jj==1 || lend len2 )

{

cf = jj=0;

while( d[jj] = ‘0’ jj lend ) ++jj;

if( lend-jj len2 ) cf = 1;

else

if( lend-jj len2 ) cf = 0;

else

{

i2 = 0; cf = 1;

for( i=jj; i lend; ++i )

{

if( d[i] str2[i2] )

{

cf = 0; break;

}

else if( d[i] str2[i2] )

{

break;

}

++i2;

}

}//else

while( cf )

{

i2 = len2-1; cf = 0;

for( i=lend-1; i = lend-len2; –i )

{

d[i] = d[i]-str2[i2]+’0′;

if( d[i] ‘0’ )

{

d[i] = d[i]+10; carry = 1;

–d[i-1];

}

else carry = 0;

–i2;

}

++c[j]; jj=0;

while( d[jj] = ‘0’ jj lend ) ++jj;

if( lend-jj len2 ) cf = 1;

else

if( lend-jj len2 ) cf = 0;

else

{

i2 = 0; cf = 1;

for( i=jj; i lend; ++i )

{

if( d[i] str2[i2] )

{

cf = 0; break;

}

else if( d[i] str2[i2] )

{

break;

}

++i2;

}

}//else

}//while

jj = 0;

while( d[jj] = ‘0’ jj lend ) ++jj;

for( i=0;i lend-jj; ++i ) d[i] = d[i+jj];

d[i] = str1[i1+1]; lend = i+1;

++j;

}//else

}//for

i = tag = 0;

while( c[i] == 0 ) ++i;

for( ; i j; ++i, ++tag ) str3[tag] = c[i]+’0′;

str3[tag] = ‘\0’;

}

int main()

{

char a[110], b[110], c[110];

scanf( “%s%s”, a, b );

Div( a, b, c );

printf( “%s\n”, c );

return 0;

}

//只得到商的整數部分,小數部分沒有

怎樣勇C語言編一個大數除法程序

在超高精度算法中,最難的就是除法了。(乘法,加法,減法,都要會)

模擬人工算法吧(大數都採用字符數組!)

做除法運算,首先至少要會乘法。

123456789*5

運算如下:

9*5=5進4,5*8=0 加個位進位4 進4,以此類推

大數之間的比較,也要會,這個簡單就不說了,如果這個也不會,那我沒辦法說下去了!

除法如下:

把數字當放入字符數組….

假設:17346777412563/2365489

2365489(7位)

1734677(7位)

使用字符數組比較,如果是小於,那麼採用17346777(8位)

一.然後2365489*9=的結果跟17346777,如果大於就2365489*8….依次類推直到小於。求得結果的第一位了。

然後17346777-2365489*x=餘數跟(17346777後一位)4組合,看是否大於2365489,大於就

進入一步驟方式運算。小於的話,結果的第二位就是0。

大致思路講了,只要中間思路分析清楚,基本上不會有多大問題。總之,模擬人工。

這樣的話,不管多大的數字之間的除法都OK的!

思路不懂可以來問我,如果,要我寫代碼,就別找我了

用c語言 數組 做大數 加減乘除 急

參考代碼:

#include stdio.h

#define MAXINT 1000

int compare(int a[],int b[]);

int bigplus(int a[],int b[],int c[]);

int bigsub(int a[],int b[],int c[]);

int bigmult(int a[],unsigned int b,int c[]);

int bigmult2(int a[],int b[],int c[]);

int bigdiv(int a[],unsigned int b,int c[],int *d);

int bigdiv2(int a[],int b[],int c[],int d[]);

int main(int argc, char *argv[])

{

  int a[MAXINT]={10,5,4,6,5,4,3,2,1,1,1};     //被乘數或被除數

  int b[MAXINT]={7,7,6,5,4,3,2,1};             //乘數或除數

  int c[MAXINT],d[MAXINT];                    //c[]存放商,d[]存放餘數

  int div=1234;                               //小乘數或小除數

  int k=0;

  int *res=k;                                //小餘數整數指針

  bigplus(a,b,c);

  bigsub(a,b,c);  

  bigmult2(a,b,c);  

  bigdiv2(a,b,c,d);

  getchar();

  return 0;

}

int bigplus(int a[],int b[],int c[])  //大整數加法

{

    int i,len;

    len=(a[0]b[0]?a[0]:b[0]);  //a[0] b[0]保存數組長度,len為較長的一個

    for(i=0;iMAXINT;i++)       //將數組清0

        c[i]=0;

    for (i=1;i=len;i++)        //計算每一位的值

    {

        c[i]+=(a[i]+b[i]);

        if (c[i]=10)

        {

           c[i]-=10;            //大於10的取個位

           c[i+1]++;            //高位加1

        }

    }

    if (c[i+1]0) len++;

        c[0]=len;                //c[0]保存結果數組實際長度

    printf(“Big integers add: “;

    for (i=len;i=1;i–)

                printf(“%d”,c[i]); //打印結果

        printf(“\n”;

    return 0;

}

int bigsub(int a[],int b[],int c[]) //大整數減法

{

    int i,len;

    len=(a[0]b[0]?a[0]:b[0]);  //a[0]保存數字長度,len為較長的一個

    for(i=0;iMAXINT;i++)       //將數組清0

        c[i]=0;

    if (compare(a,b)==0)        //比較a,b大小

    {

       printf(“Result:0”;

       return 0;

    }

    else if (compare(a,b)0)

    for (i=1;i=len;i++)        //計算每一位的值

    {

        c[i]+=(a[i]-b[i]);

        if (c[i]0)

        {

           c[i]+=10;            //小於0的原位加10

           c[i+1]–;            //高位減1

        }

    }

    else

        for (i=1;i=len;i++)        //計算每一位的值

        {

        c[i]+=(b[i]-a[i]);

        if (c[i]0)

        {

           c[i]+=10;            //小於0原位加10

           c[i+1]–;            //高位減1

        }

        }

    while (len1  c[len]==0)  //去掉高位的0

        len–;

    c[0]=len;

    printf(“Big integers sub= “;

    if (a[0]b[0]) printf(“-“;

    for(i=len;i=1;i–)         //打印結果

        printf(“%d”,c[i]);

    printf(“\n”;

    return 0;

}

int bigmult2(int a[],int b[],int c[])      //高精度乘以高精度

{

    int i,j,len;

    for (i=0;iMAXINT;i++)                  //數組清0

        c[i]=0;

    for (i=1;i=a[0];i++)                  //被乘數循環

      for (j=1;j=b[0];j++)                //乘數循環

      {

         c[i+j-1]+=a[i]*b[j];              //將每一位計算累加

         c[i+j]+=c[i+j-1]/10;              //將每一次結果累加到高一位

         c[i+j-1]%=10;                     //計算每一次的個位

      }

   len=a[0]+b[0];                          //取最大長度

   while (len1  c[len]==0)              //去掉高位0

      len–;

   c[0]=len;

   printf(“Big integers multi: “;

   for (i=len;i=1;i–)                    //打印結果

      printf(“%d”,c[i]);

   printf(“\n”; 

}

int bigdiv2(int a[],int b[],int c[],int d[])  //高精度除以高精度

{

   int i,j,len;

   if (compare(a,b)0)                        //被除數較小直接打印結果

   {

     printf(“Result:0”;

     printf(“Arithmetic compliment:”;

     for (i=a[0];i=1;i–) printf(“%d”,a[i]);

     printf(“\n”;

     return -1;           

   }

   for (i=0;iMAXINT;i++)                     //商和餘數清0

   {

      c[i]=0;

      d[i]=0;

   }

   len=a[0];d[0]=0;

   for (i=len;i=1;i–)                       //逐位相除

   {

      for (j=d[0];j=1;j–)

        d[j+1]=d[j];

      d[1]=a[i];                              //高位*10+各位

      d[0]++;                                 //數組d長度增1

      while (compare(d,b)=0)                 //比較d,b大小

      {

            for (j=1;j=d[0];j++)              //做減法d-b

            {

                d[j]-=b[j];

                if (d[j]0)

                {

                   d[j]+=10;

                   d[j+1]–;

                }

            }

                while (j0  d[j]==0)        //去掉高位0

                      j–;

                d[0]=j;

            c[i]++;                           //商所在位值加1

      }

   }

   j=b[0];

   while (c[j]==0  j0) j–;                //求商數組c長度

     c[0]=j;

   printf(“Big integers div result: “;

   for (i=c[0];i=1;i–)                      //打印商

     printf(“%d”,c[i]);

   printf(“\tArithmetic compliment: “;       //打印餘數

   for (i=d[0];i=1;i–)

     printf(“%d”,d[i]);

   printf(“\n”);

}

c語言大數相除和大數求摸怎麼實現?

1、大數就是位數多,數值大的意思。通常來說c語言里的基本數據類型範圍是有限的,如long型的最大只能表示幾十億,幾十億也就11位數字長度而已。如果用100長的數組表示,假設數組一個元素存數字的一位,那麼總位數可以達到100位,這是基本數據類型無法表示的。

2、例程:

#include”stdio.h”

int getlength(char a[]){

 int i=0;

 while(a[i])

  i++;

 return i;

}/*返回字符串的長度*/

int chartoint(char a){

 return a-48;

}/*將字符編程整形*/   

void creatarray(char a[],char b[]){

 printf(“請輸入第一個數:”);

 scanf(“%s”,a);

 printf(“請輸入第二個數:”);

 scanf(“%s”,b);

}/*創建數組*/

void go(char a[],char b[],int s[]){

 int alength=getlength(a);

 int blength=getlength(b);

 int i=alength-1;

 int j=blength-1;

 int k;/*s數組下標*/

 int slength;

 if(alengthblength)

  slength=alength;

 else

  slength=blength;

 k=slength;

 while(i=0j=0)

  s[k–]=chartoint(a[i–])+chartoint(b[j–]);

 while(i=0)

  s[k–]=chartoint(a[i–]);

 while(j=0)

  s[k–]=chartoint(b[j–]);

 k=slength;

 while(k=2){

  if(s[k]=10){

   s[k-1]++;

   s[k]-=10;

  }

  k–;

 }

 printf(“兩數之和為:”);

 if(s[1]=10){

  s[0]=1;

  s[1]-=10;

  for(i=0;i=slength;i++)

   printf(“%d”,s[i]);

 }

 else{

  for(i=1;i=slength;i++)

   printf(“%d”,s[i]);

 }

 printf(“\n”);

}

void main(){

 char a[1000],b[1000];

 int s[1000];

 int lab;

lab1: creatarray(a,b);

 go(a,b,s);

 printf(“請輸入1繼續(想退出按其他數字鍵):”);

 scanf(“%d”,lab);

 if(lab==1)

  goto lab1;

}

C語言課程設計大數乘法和除法

#include stdio.h #include string.h #define MAXCHAR 20000 void Add (char *ch1 , char *ch2 , char *ch3) {// ch3 = ch1 + ch2; int len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , i , tmp , num1[MAXCHAR] , num2[MAXCHAR] , num3[MAXCHAR]; memset (num1 , 0 , sizeof(num1)); memset (num2 , 0 , sizeof(num2)); memset (num3 , 0 , sizeof(num3)); for (i=len1-1;i=0;i–) num1[len1-1-i] = ch1[i] – 48; for (i=len2-1;i=0;i–) num2[len2-1-i] = ch2[i] – 48; i = 0 , tmp = 0 , len3 = len1 len2 ? len1 : len2; while (i len3) { num3[i] = num1[i] + num2[i] + tmp; tmp = 0; if (num3[i] = 10) { tmp = num3[i]/10; num3[i] %= 10; } i ++; } if (tmp != 0) { num3[i] = tmp; i ++; } len3 = i; for (i=len3-1;i=0;i–) ch3[len3-1-i] = num3[i] + 48; ch3[len3] = ‘\0’; return ; } void Minus (char *ch1 , char *ch2 , char *ch3) { // 保證 ch1 ch2 : ch3 = ch1 – ch2 int i , tmp , len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , num1[MAXCHAR] , num2[MAXCHAR] , num3[MAXCHAR]; memset (num1 , 0 , sizeof(num1)); memset (num2 , 0 , sizeof(num2)); memset (num3 , 0 , sizeof(num3)); for (i=0;ilen1;i++) num1[len1-1-i] = ch1[i] – 48; for (i=0;ilen2;i++) num2[len2-1-i] = ch2[i] – 48; i = 0 , tmp = 0 , len3 = len1 len2 ? len1 : len2; while (i len3) { num3[i] = num1[i] – num2[i] – tmp; if (num3[i] 0) { num3[i] += 10 , tmp = 1; } else tmp = 0; i ++; } while (len3 1 num3[len3-1] == 0) len3 –; for (i=0;ilen3;i++) ch3[i] = num3[len3-1-i] + 48; ch3[len3] = ‘\0’; return ; } void MUL (char *ch1 , char *ch2 , char *ch3) {// ch3 = ch1*ch2; int i , j , len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , tmp , num1[MAXCHAR] , num2[MAXCHAR] , num3[MAXCHAR]; memset (num1 , 0 , sizeof(num1)); memset (num2 , 0 , sizeof(num2)); memset (num3 , 0 , sizeof(num3)); for (i=len1-1;i=0;i–) num1[len1-1-i] = ch1[i] – 48; for (i=len2-1;i=0;i–) num2[len2-1-i] = ch2[i] – 48; for (i=0;ilen1;i++) { tmp = 0; for (j=0;jlen2;j++) { num3[i+j] += num1[i]*num2[j] + tmp; tmp = 0; if (num3[i+j] = 10) { tmp = num3[i+j]/10; num3[i+j] %= 10; } } while (tmp != 0) { num3[i+j] += tmp; tmp = num3[i+j]/10; j ++; } } len3 = len1+len2; while (len3 1 num3[len3-1] == 0) len3 –; for (i=0;ilen3;i++) ch3[len3-1-i] = num3[i] + 48; ch3[len3] = ‘\0’; return ; } int cmp (char *ch1 , char *ch2) {// ch1 ch2 return 1; ch1 ch2 return -1; ch1 == ch2 return 0; int i , len1 = strlen (ch1) , len2 = strlen (ch2); if (len1 len2) return 1; if (len2 len1) return -1; for (i=0;ilen1;i++) { if (ch1[i] ch2[i]) return 1; if (ch1[i] ch2[i]) return -1; } return 0; } void Div (char *ch1 , char *ch2 , char *ch3) {//保證ch1ch2 ch2 != 0 : ch3 = ch1/ch2 , ch1 = ch1%ch2 , 需要支持函數:cmp () , Minus (); int i , len1 , len2 , tmp; char ch4[MAXCHAR] , ch5[MAXCHAR]; ch3[0] = ‘0’ , ch3[1] = ‘\0’; while (cmp (ch1 , ch2) = 0) { len1 = strlen (ch1) , len2 = strlen (ch2); tmp = len1-len2-1 0 ? len1-len2-1 : 0; ch4[0] = ‘1’; memcpy (ch5 , ch2 , (len2+1)*sizeof(char)); for (i=0;itmp;i++) { ch4[1+i] = ‘0’ , ch5[len2+i] = ‘0’; } ch4[1+i] = ‘\0’; ch5[len2+i] = ‘\0’; Add (ch3 , ch4 , ch3); // ch3 += ch4; Minus (ch1 , ch5 , ch1); // ch1 -= ch5; } return ;} void Mod (char *ch1 , char *ch2) {// 保證ch1 = ch2 : ch1 %= ch2 , 需要支持函數:Minus () , cmp (); int i , len1 , len2 , tmp; char ch3[MAXCHAR]; while (cmp (ch1 , ch2) = 0) { len1 = strlen (ch1) , len2 = strlen (ch2); tmp = len1-len2-1 0 ? len1-len2-1 : 0; memcpy (ch3 , ch2 , (len2+1)*sizeof(char)); for (i=0;itmp;i++) ch3[len2 + i] = ‘0’; ch3[len2 + i] = ‘\0’; Minus (ch1 , ch3 , ch1); } return ; } int main () { char ch1[MAXCHAR] , ch2[MAXCHAR] , ch3[MAXCHAR]; while (scanf (“\n%s %s” , ch1 , ch2) != EOF) { Add(ch1,ch2,ch3); printf (“兩數之和:%s\n” , ch3); Minus(ch1,ch2,ch3); printf (“兩數之差:%s\n” , ch3); MUL(ch1,ch2,ch3); printf (“兩數之積:%s\n” , ch3); Div(ch1,ch2,ch3); printf (“兩數之商:%s\n” , ch3); } return 0; } 我的高精度模版。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/190600.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-30 09:05
下一篇 2024-11-30 09:05

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python3個數中的最大數的查找方法

    Python是一種高級編程語言,擁有易學易用、可移植性強、高效極速等優勢,被廣泛應用於數據分析、Web開發、人工智能等多個領域。在Python中,查找給定數列表中的最大數是一個非常…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28

發表回復

登錄後才能評論