c++语言大数与大数的运算,N!

来源:互联网 发布:网络热门话题 编辑:程序博客网 时间:2024/06/08 09:18

1.大数加大数之模拟手工算法:

(注:这里的代码不是很完善、简洁和公整,请见谅)

这里介绍的这种方法是大数加大数就是利用两个字符窜,从后一直往前加。

这里只考虑了str1字符串比str2字符串长,

#include<iostream>#include<string>using namespace std;int main(){string str1, str2;while (cin >> str1 >> str2){int len1, len2,i,j;    len1 = str1.size();     // 字符串str1的长度 len2 = str2.size();     //字符串str2的长度 for (i = len1 - 1, j = len2 - 1; i >= 0; i--, j--)str1[i] = str1[i] + (j >= 0 ? str2[j] - '0' : 0);//字符串从最后往前加,直到str2的首个字符为止 for (i =len1-1; i >=0;i--)if (str1[i] -'0' >= 10){                         //利用循环,若超过10就向前进位 if(i)str1[i - 1] += 1;else cout << "1";              //加后的字符串长度超了原来的最大长度,如999+2=1001 str1[i] = (str1[i] - '0') % 10 + '0';}cout << str1<< endl;}return 0;}


2.大数减大数之模拟手工算法:

#include<iostream>#include<string>using namespace std;const int Max=2000; void minusstring(string a,string b){int len1,len2,ai[Max],bi[Max],ci[Max];memset(ci,0,sizeof(ci));//对数组进行初始化,清0工作 memset(ai,0,sizeof(ai));memset(bi,0,sizeof(bi));string temp;int i,j,flag=0;len1=a.size();len2=b.size();if(len1<len2)//判断两个字符窜的长度 ,保证长的在前面 { temp=a; a=b; b=temp; flag=1; //起到标记的作用,判断最后是否为负数 }else if(len1==len2)//当字符串长度一样时,数字大的在前 {for(i=0;i<len1;i++){   if(a[i]<b[i])    {      temp=a;     a=b;     b=temp;     flag=1;      //起到标记的作用,判断最后是否为负数  break;      //一旦碰到后者有一个字符大一些,就进行交换后break,如1111和1121     }    else if(a[i]>b[i])break;}}len1=a.size();  //重新对交换后的字符串进行长度测量 len2=b.size();for(i=0;i<len1;i++)//存入到int型的数组当中去 ai[i]=a[i]-'0';for(j=0;j<len2;j++)//存入到int型的数组当中去 bi[j]=b[j]-'0';for(i=len1-1,j=len2-1;i>=0;i--,j--)//利用循环,从后往前减,并存入c中 {    if(j>=0)ci[i]=ai[i]-bi[j];else ci[i]=ai[i]-0;}for(i=len1-1;i>=0;i--)//利用循环,判断是否为负,再进行整理 {if(ci[i]<0&&i!=0){ci[i]+=10;ci[i-1]--;}}if(flag==1)cout<<"-";i=0;while(ci[i]==0)i++; //跳过前面的0 for(i=i;i<len1;i++)    cout<<ci[i];cout<<endl;}int main(){string str1,str2;while(cin>>str1>>str2)minusstring(str1,str2);return 0;}



3.大数乘大数之模拟手工算法:

利用乘法的原理进行计算,如:12x13=156



#include<iostream>#include<string>using namespace std;void mulity(const char *a,const char *b,int ailen,int bilen){int i,j,*s;int cilen;cilen=ailen+bilen;//字符串总的长度 s=(int *)malloc(sizeof(int)*cilen);for(i=0;i<cilen;i++)s[i]=0;for(i=0;i<ailen;i++)   for(j=0;j<bilen;j++)      s[i+j+1]+=(a[i]-'0')*(b[j]-'0');//利用乘法的原理进行计算并存储     for(i=cilen-1;i>=0;i--)             {    if(s[i]>=10)            //利用循环,判断,再进行进位操作     {    s[i-1]+=s[i]/10;    s[i]%=10;    }    }    char *p3=(char *)malloc(sizeof(char)*cilen);  //申请分配内存     i=0;    while(s[i]==0)i++;    for(j=0;i<cilen;i++,j++)   //以字符的形式存储和输出,占的空间会小很多     p3[j]=s[i]+'0';    p3[j]='\0';    for(i=0;i<cilen;i++)    cout<<p3[i];    cout<<endl;    free(s);    free(p3);        //别忘了释放占用的内存 }int main(){string str1,str2;while(cin>>str1>>str2){int ailen,bilen;ailen=str1.size();bilen=str2.size();const char *p1=str1.c_str();  //把string定义的字符串转化为char型的字符串 const char *p2=str2.c_str();mulity(p1,p2,ailen,bilen);}return 0;}

4.N!

#include<iostream>#include<iomanip>using namespace std;int a[10001];void factical(int n){int place,carry=0,i,j;  //place记录当前位置,carry记录往前进多少     a[0]=1;for(i=1;i<=n;i++)   //进行互乘,进位 {carry=0;for(j=0;j<=place;j++) {a[j]=a[j]*i+carry;carry=a[j]/10000;    a[j]%=10000;}if(carry>0){place++;a[place]=carry;}}for(i=place;i>=0;i--)if(i==place)cout<<a[i];else cout<<setw(4)<<setfill('0')<<a[i];//位数不够四位,往左边补0 cout<<endl;}int main(){int N;while(cin>>N)factical(N);return 0;}


0 0
原创粉丝点击