紫书第五章-----C++与STL入门(3(随机数,高精度))

2019-04-14 18:53发布

class="markdown_views prism-tomorrow-night">

产生随机数

注意:rand()后面模的那个数不能超过系统所对应的整数的大小范围,但是可以利用加减乘除模等运算进行扩充(精度要求不太高的话,此方可行) #include #include #include using namespace std; int main() { //srand()函数包含在cstdlib中 //time()函数包含在ctime中 srand((unsigned)time(NULL));//没这条语句的话,每次调用程序产生的随机数是相同的 for(int i=0;i<10;i++) cout<<(rand()%100+1)<<" "<10<//产生1-100随机数及产生0-9随机数 return 0; }

任意位大整数加减乘除(用string和vector实现)

/* 本程序可以实现任意位数的大整数加减乘除运算,除法包括余数求解 CSDN博客author:ccnuacmhdu 完成时间:2017-10-28 注:程序适用于有前导0的情形 该程序可以解决OpenJ_Bailian2737,2736,2981,2980 */ #include #include #include #include using namespace std; void rid_head_0(string &s);//去除前导0 int compare(string s1,string s2);//比较大小,s1>s2返回1,s1=s2返回0,s1 string big_num_add(string s1,string s2);//大整数加法 string big_num_minus(string s1,string s2);//大整数减法 string big_num_mul(string s1,string s2);//大整数乘法 string big_num_div(string s1,string s2,string &remainder);//大整数除法 int main() { string s1,s2,remainder; while(cin>>s1>>s2){ cout<cout<cout<cout<cout<" "<return 0; } void rid_head_0(string &s){ int i; for(i=0;i'0';i++); if(i==s.length()) s="0"; else{ string ss(s.begin()+i,s.end()); s=ss; } } int compare(string s1,string s2){ if(s1==s2) return 0; else if(s1.length()>s2.length() || (s1.length()==s2.length() && s1>s2)) return 1; else return -1; } //思想:先调整好一样的长度,再模拟手算,再处理进位 string big_num_add(string s1,string s2){ vector<int>v1,v2; int len=max(s1.length(),s2.length()); for(int i=s1.length()-1;i>=0;i--){v1.push_back(s1[i]-'0');} for(int i=s2.length()-1;i>=0;i--){v2.push_back(s2[i]-'0');} for(int i=0;i0);} for(int i=0;i0);} for(int i=0;ifor(int i=0;i1;i++){ v1[i+1]+=(v1[i]/10); v1[i]%=10; } if(v1[len-1]>=10){ v1.push_back(1); v1[len-1]%=10; } char *p=new char[v1.size()]; int j=0; for(int i=v1.size()-1;i>=0;i--) p[j++]=v1[i]+'0'; string s(p,p+v1.size()); rid_head_0(s); delete []p; return s; } //思想:(调整)大减小,处理借位,处理正负 string big_num_minus(string s1,string s2){ string big,small; rid_head_0(s1);rid_head_0(s2);//首先要去除前导0,再用compare函数比较 int judge=compare(s1,s2); if(judge==0) return "0"; else if(judge==1){big=s1;small=s2;} else {big=s2;small=s1;} vector<int>v1,v2; for(int i=big.length()-1;i>=0;i--){v1.push_back(big[i]-'0');} for(int i=small.length()-1;i>=0;i--){v2.push_back(small[i]-'0');} for(int i=0;i0);} for(int i=0;ifor(int i=0;i1;i++){ if(v1[i]<0){ v1[i]+=10; v1[i+1]-=1; } } char *p=new char[v1.size()]; int j=0; for(int i=v1.size()-1;i>=0;i--) {p[j++]=v1[i]+'0';} string s(p,p+v1.size()); rid_head_0(s); if(judge==-1){ char *q=new char[s.length()+1]; q[0]='-'; for(int i=0;i1]=s[i];} string ss(q,q+s.length()+1); s=ss; delete[] q; } delete[] p; return s; } //思想:以123X72为例,123X72,结果分两行显示,分别是2 4 6和7 14 21,回到大整数加法 string big_num_mul(string s1,string s2){ rid_head_0(s1);rid_head_0(s2); vector<int>v1,v2; for(int i=s1.length()-1;i>=0;i--) v1.push_back(s1[i]-'0'); for(int i=s2.length()-1;i>=0;i--) v2.push_back(s2[i]-'0'); int *p=new int[v1.size()+v2.size()+5]; for(int i=0;i5;i++) p[i]=0; for(int i=0;ifor(int j=0;jfor(int i=0;i<=v1.size()+v2.size()+3;i++){ p[i+1]+=(p[i]/10); p[i]%=10; } char *q=new char[v1.size()+v2.size()+5]; int j=0; for(int i=v1.size()+v2.size()+4;i>=0;i--) q[j++]=p[i]+'0'; string s(q,q+j); rid_head_0(s); delete[] p; delete[] q; return s; } //思想:除法当减法。先调整减数与被减数位数相同(短的补0), //反复减到不够减。比如7546除以23,起初商为0,先减23的100倍, //够减3次,余下646,商的值增加300,再用646减23的10倍230,够 //减2次,余下186,则商增加20,最后用186减23,够减8次,则商 //增加8,最后商就是328 int substract(vector<int> &v1,vector<int> &v2){ if(v1.size()return -1; if(v1.size()==v2.size()){ for(int i=v1.size()-1;i>=0;i--){ if(v1[i]>v2[i]) break; else if(v1[i]return -1; } } for(int i=0;iif(v1[i]<0){ v1[i]+=10; v1[i+1]-=1; } } int j; for(j=v1.size()-1;j>=0 && v1[j]==0;j--){ v1.pop_back(); } return j+1; } string big_num_div(string s1,string s2,string &remainder){ rid_head_0(s1);rid_head_0(s2); if(compare(s1,s2)<0){remainder=s1;return "0";} vector<int>v1,v2; for(int i=s1.length()-1;i>=0;i--) v1.push_back(s1[i]-'0'); int *p=new int[v1.size()]; int j; for(j=0;j0; for(int i=s2.length()-1;i>=0;i--) p[j++]=s2[i]-'0'; for(int i=0;iint *quotient=new int[s1.length()-s2.length()+1]; for(int i=0;i<=s1.length()-s2.length();i++) quotient[i]=0; for(int i=0;i<=s1.length()-s2.length();i++){ while(substract(v1,v2)>=0){ quotient[i]++; } v2.erase(v2.begin(),v2.begin()+1); } char *q=new char[s1.length()-s2.length()+1]; for(int i=0;i<=s1.length()-s2.length();i++) q[i]=quotient[i]+'0'; string s(q,q+s1.length()-s2.length()+1); rid_head_0(s); char *r=new char[v1.size()]; int k=0; for(int i=v1.size()-1;i>=0;i--) r[k++]=v1[i]+'0'; string ss(r,r+v1.size()); remainder=ss; if(remainder.empty()) remainder="0";//注意余数为0的情形 delete[] p; delete[] q; delete[] quotient; delete[] r; return s; }