为了明天能交上作业,我现在来写题解了
(鬼知道我今天晚上到底要写多少个题解)
高精度加法·
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; char a1[10003],b1[10003]; int a[10003],b[10003],c[10003]; int ans = 0; int main() { gets(a1); gets(b1); int lena = strlen(a1),lenb = strlen(b1); for(int i = 1;i <= lena;i++) { a[i] = a1[lena - i] - 48; } for(int i = 1;i <= lenb;i++) { b[i] = b1[lenb - i] - 48; }//读入完成 for(int i = 1;i <= max(lena,lenb) + 1;i++) { c[i] += b[i] + a[i]; c[i + 1] = c[i] / 10; c[i] = c[i] % 10; ans++; }//进行相加 for(int i = ans;i >= 1;i--) { if(c[i] != 0) break; ans--; }//删除前导0 for(int i = ans;i >= 1;i--) { printf("%d",c[i]); } return 0;//逆序输出 }
高精度减法
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 using namespace std; 5 int main() 6 { 7 gets(a1); 8 gets(b1); 9 if(lena < lenb||(lena == lenb && strcmp(a1,b1) < 0)) 10 //strcmp为字符串比较函数,当n1 == n2,返回0;n1 < n2,返回负整数;n1 > n2,返回正整数; 11 { 12 printf("-"); 13 strcpy(n,a1);//把a1数组的值赋值给n数组 14 strcpy(a1,b1); 15 strcpy(b1,n); 16 //交换减数与被减数 17 } 18 int lena = strlen(a1),lenb = strlen(b1); 19 for(int i = 1;i <= lena;i++) 20 { 21 a[i] = a1[lena - i] - 48; 22 } 23 for(int i = 1;i <= lenb;i++) 24 { 25 b[i] = b1[lenb - i] - 48; 26 } 27 int ans = 0; 28 for(int i = 1;i <= max(lena,lenb);i++) 29 { 30 if(a[i] < b[i]) 31 { 32 a[i + 1]--;//向前一位借位 33 a[i] = a[i] + 10; 34 } 35 c[i] = a[i] - b[i]; 36 ans++; 37 } 38 for(int i = ans;i >= 1;i--) 39 { 40 if(c[i] == 0) ans--;还是为了删除前导0 41 } 42 for(int i = ans;i >= 1;i--) 43 { 44 printf("%d",c[i]); 45 } 46 return 0; 47 }
高精度阶乘
#include<cstdio> #include<cstring> #include<cmath> using namespace std; int a[256]; int main() { int n; scanf("%d",&n); int l = 1; a[1] = 1;//为数组赋初值,避免一直到最后数组都输出0 for(int i = 1;i <= n;i++) { for(int j = 1;j <= l;j++)//得出阶乘的结果 { a[j] = a[j] * i; } for(int j = 1;j <= l - 1;j++)//处理每一位是否进位 { a[j + 1] += a[j] / 10; a[j] = a[j] % 10; } if(a[l] > 10)//处理最高位是否进位 { a[l + 1] = a[l] / 10; a[l] = a[l] % 10; l++; } for(int i = l;i >= 1;i--) { printf("%d",a[i]); } } return 0; }
高精度乘法
就是按照人类正常计算乘法的顺序来写这个程序,设个双重循环保证每一位都被循环到,然后再进位就可以了
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; char a[1003],b[1003]; int n[2003]; int main() { gets(a); gets(b); int lena = strlen(a),lenb = strlen(b); for(int i = 0;i <= lena - 1;i++) { for(int j = 0;j <= lenb - 1;i++) { n[i + j + 1] += (int(a[i])- 48) * (int(b[i]) - 48); //把每一位 都乘上去然后再累加 } } for(int i = lena + lenb - 1;i > 1;i++) { if(n[i] >= 10) { n[i - 1] += n[i] / 10; n[i] %= 10; } } for(int i = 1;i <= lena + lenb - 1;i++) { printf("%d",n[i]); } return 0; }
我现在很困
但是明天还要交题解
果然不作死就不会死
如果上帝再给我一个周五,我一定投身于伟大的学习事业(连自己都不信/滑稽)
高精度除法
#include<cstdio> #include<cstring> char n[1005]; long long temp,m; int main() { bool flag=0; scanf("%s%lld",n,&m); for (int i=0;i<strlen(n);i++)//输出整数部分 { temp=temp*10+n[i]-'0';//上次余数乘10再加上这一位的数字 if (temp/m!=0)//若小数点前的数均为0,则干脆什么也不输出 flag=1; if (flag==1) printf("%d",temp/m); temp%=m;//每次做完除法之后的余数 } printf("."); for (int i=1;i<=500;i++)//输出500位小数 { temp*=10;//temp变化原理同整数部分 printf("%d",temp/m); temp%=m; } return 0; }
组合数
快三点了,明天要是有人发现我在上课时睡着了记得叫我,此处手动@任艾茜小朋友
算了我先睡了,明天再把它写完好了
~~~~~这是周五与周六的分割线~~~~~~~
我又回来了
这个写组合数标程的人真的太巨了!在此为他献上我的膝盖!!!
#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cstdlib> using namespace std; int a[30000],t,i,j,n,r,s; int b[21]; const int maxn=20; void divide(int n) { int m; m=2; while (m*m<=n) { while (n%m==0&&n!=0) //同样把分母也变成这种几个质因数相乘的形式 { n=n/m; a[m]--;//分母中出现一个m,就可以把对应分子中的m约掉一个 } m++; } a[n]--;//最后除来除去剩下的没有被除掉的数也可以和分子中的这种数约掉 } void times(int n) { int m; m=2; while (m*m<=n) { while(n%m==0&&n!=0)//为了约分,把一个数变成几个质因数相乘的形式 { n=n/m; a[m]++;//a[m]表示m这个数在分子中出现的个数 } m++; } a[n]++;//再给最后除来除去最后剩下那个数的个数加一 } void add(int d) { int dd,i,t; i=1; j=0; while (i<=maxn) { t=b[i]*d+j; //这个就是一个正常的高精度了 b[i]=t%10; j=t/10; i++; } } int main() { cin>>n>>r; memset(a,0,sizeof(a)); i=n-r+1; j=r; do { if (i<=n) { times(i); i++; //把每个数都分别乘进去的时候对每个数都进行相应的约分操作 } if (j>1) { divide(j); j--; } }while(i<=n||j>1); memset(b,0,sizeof(b)); b[1]=1;//为b数组第一位赋初值,防止乘到最后全是零 for (i=2;i<=29999;i++)//现在把约分最后没约掉的几个数乘起来 { while (a[i]>0)//只要分子中还有这个数,我们就继续乘 { add(i); a[i]--;//标志着i这个数已被乘完一次 } } for (j=10; j>=1;j--) cout<<b[j]; cout<<endl; return 0; }
终于补上了之前欠下的题解,现在整个人开始焕发新生!