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
- c++语言大数与大数的运算,N!
- RSA与大数运算(C语言)
- 【C语言代码】大数N的阶乘!
- 1002N!(C语言N的阶乘 大数模板)
- C语言大数运算-大数运算库篇
- 大数的加减乘除运算(C++)
- 【C++】C++大数的运算
- (大数运算) N!
- 用C语言吧编的大数运算代码
- 大数运算之100的阶乘(C语言实现)
- c语言面试题之大数运算
- 大数运算模板(C语言)
- C语言大数运算-加法篇
- C语言大数运算-减法篇
- c语言版大数计算器(实现大数的加减乘除运算)
- C语言:大数相加与大数相减.
- C语言 大数相加与大数相减
- 大数运算 (C++)
- Android的三种网络通信方式
- C++派生类与基类的转换规则
- myeclipse中引入类报错
- Gabor滤波简介和实现(Matlab,OpenCV)
- Android长度单位px,in,mm,pt,dp,dip,sp换算公式以及区别
- c++语言大数与大数的运算,N!
- My First Blog!
- ObjectARX学习笔记(十三)----如何高亮显示AcDbGroup中的单个实体,或者全部高亮显示
- 文本框的blur事件
- SQL服务器注入攻击的主动防御技术研究
- 减压方法大全:放弃无意义的固执
- Eclipse下使用Fat Jar插件对源代码进行打包
- vc里实现不规则窗体
- XSS(Cross Site Scripting)攻击