生活随笔
收集整理的這篇文章主要介紹了
大数
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
因?yàn)檎巫兞康姆秶?#xff0c;所以當(dāng)我們想求長(zhǎng)度非常大的兩個(gè)數(shù)的和,差,乘,除的時(shí)候不能用簡(jiǎn)單的直接加減乘除。
首先我們要知道數(shù)在數(shù)組里存儲(chǔ)是逆序的,比如說(shuō)輸入123,實(shí)際上是321;
由于大數(shù)的位數(shù)很多,因此我們考慮把每一位都存放在數(shù)組里。
下面就是有關(guān)大數(shù)的一些運(yùn)算的問(wèn)題;
1.大數(shù)的加法
加法需要考慮的就是進(jìn)位的問(wèn)題
#include<stdio.h>
#include<string.h>
int main()
{char s[1000]={0},a[1000]={0};scanf("%s%s",s,a);int s1[1000],a1[1000],slen=strlen(s),alen=strlen(a),i;for(i=0;i<slen;i++)s1[i]=s[slen-1-i]-'0';for(i=0;i<alen;i++)a1[i]=a[alen-1-i]-'0';if(alen<slen)alen=slen;for(i=0;i<=alen;i++){a1[i]+=s1[i];a1[i+1]+=a1[i]/10;a1[i]%=10;}while(a1[alen]==0&&alen>1)alen-=1;//這是為了去掉前導(dǎo)0;for(i=alen;i>=0;i--)printf("%d",a1[i]);return 0;
}
大數(shù)的減法
減法和加法差不多,不同的是要考慮的是借位的問(wèn)題
這里就只介紹較大的數(shù)減去較小的數(shù),因?yàn)樾〉臏p去大的加個(gè)‘-’就行了
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{char a[1000]={0},b[1000]={0};scanf("%s%s",a,b);int a1[202]={0},b1[202]={0},alen=strlen(a),blen=strlen(b),i;for(i=0;i<alen;i++)a1[i]=a[alen-1-i]-'0';for(i=0;i<blen;i++)b1[i]=b[blen-1-i]-'0';for(i=0;i<alen;i++){a1[i]=a1[i]-b1[i];if(a1[i]<0){a1[i]+=10;a1[i+1]-=1;}}while(a1[alen-1]==0&&alen>=2)alen=alen-1;//去掉后導(dǎo)0;for(i=alen-1;i>=0;i--)printf("%d",a1[i]);return 0;
}
大數(shù)的乘法
大數(shù)的乘法做法有幾種,這里就介紹一種比較符號(hào)正常的邏輯的做法
比如說(shuō):
3 2 1 0 i3 2 1 0 j1 1 2 3× 1 1 2 3————————————3 3 6 92 2 4 61 1 2 3
1 1 2 3
——————————————————
1 2 5 10 10 12 9 逢10進(jìn)1
1 2 6 1 1 2 96 5 4 3 2 1 0 i+j
#include<stdio.h>
#include<string.h>
int main()
{char s1[1000]={0},a1[1000]={0};int i,j,t,s[1000]={0},a[1000]={0},len1,len2,c[2000]={0},sum;gets(s1);gets(a1);len1=strlen(s1);len2=strlen(a1);sum=len1+len2;for(i=0;i<len1;i++)s[i]=s1[len1-1-i]-'0';for(i=0;i<len2;i++)a[i]=a1[len2-1-i]-'0';for(i=0;i<len1;i++){for(j=0;j<len2;j++){c[i+j]+=s[i]*a[j];}}for(i=0;i<=sum;i++){if(c[i]>=10){c[i+1]+=c[i]/10;c[i]%=10;}}
while(c[sum]==0){sum--;}for(i=sum;i>=0;i--)printf("%d",c[i]);return 0;}
大數(shù)的除法
大數(shù)的階乘
對(duì)于大數(shù)的階乘也有很多的方法,這里先介紹一種。
比如說(shuō)我們求30的階乘,顯然超過(guò)了long long的范圍,所以再用簡(jiǎn)單的循環(huán)直接做了;
對(duì)于階乘我們?cè)趺纯紤]把它的每一位都放在數(shù)組里呢?
比如5的階乘:
a[0]=1;
a[0]=2;
a[0]=6;
a[0]=24;//到這里a[0]超過(guò)了10因此用兩個(gè)數(shù)組元素來(lái)存儲(chǔ) a[0]=4,a[1]=2;也是逆序存儲(chǔ);
到5的階乘可以想一下24×5=120,我們發(fā)現(xiàn)分別用a[0]*5=20,a[1]*5=10,
然后逢10進(jìn)1 所以a[0]=0,a[1]=12;由于a[1]>=10;所以再分一個(gè)數(shù)組元素a[1]
使得a[0]=0,a[1]=2,a[2]=1;
所以對(duì)于大數(shù)的階乘的代碼如下:
#include<stdio.h>
int main()
{int a[1000]={0},i,j,digit=1,n,t,sum;scanf("%d",&n);a[0]=1;for(i=1;i<=n;i++){sum=0;for(j=0;j<digit;j++){t=a[j]*i+sum;a[j]=t%10;sum=t/10;}while(sum)//判斷是不是需要進(jìn)位,進(jìn)多少位{a[digit]=sum%10;sum/=10;digit++;}}for(i=digit-1;i>=0;i--){printf("%d",a[i]);} return 0;
}
高精度——階乘和
總結(jié)
以上是生活随笔為你收集整理的大数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。