高精度
对于大数的加减乘除,不会JAVA,只会用C来模拟
HDU-1002-A+B Problem II
http://acm.hdu.edu.cn/showproblem.php?pid=1002
简单的大数相加,用字符串模拟即可
#include<stdio.h> #include<string.h> #include<stdlib.h> char s1[1005],s2[1005]; int s[1200]; int max(int x,int y) { return x>y?x:y; } int main() { int i,temp,t,k; int len1,len2,len; scanf("%d",&t); for(k=1;k<=t;k++) { scanf("%s %s",s1,s2); len1=strlen(s1); len2=strlen(s2); len=max(len1,len2); memset(s,0,sizeof(s)); for(i=len1-1;i>=0;i--) //将s1从低位加到s s[len1-1-i]+=(s1[i]-'0'); for(i=len2-1;i>=0;i--) s[len2-1-i]+=(s2[i]-'0'); //将s2从低位加到s for(i=0,temp=0;i<len;i++) //处理进位 { s[i]+=temp; temp=(s[i]/10); s[i]%=10; } printf("Case %d:\n",k); printf("%s + %s = ",s1,s2); if(temp>0) printf("%d",temp); for(i=len-1;i>=0;i--) //逆向输出 printf("%d",s[i]); printf(k==t?"\n":"\n\n"); } return 0; }
HDU-1042-N!
http://acm.hdu.edu.cn/showproblem.php?pid=1042
字符串模拟大数的阶乘
#include<stdio.h> #include<string.h> #include<stdlib.h> int n; void sol(int n) //模拟n的阶乘 { int i,len,j,temp; int a[50000]; a[0]=1; len=1; for(i=2;i<=n;i++) { for(j=0;j<len;j++) a[j]*=i; for(j=0,temp=0;j<len;j++) { a[j]+=temp; temp=(a[j]/10); a[j]%=10; } while(temp) { a[len++]=(temp%10); temp/=10; } } for(i=len-1;i>=0;i--) printf("%d",a[i]); printf("\n"); } int main() { while(scanf("%d",&n)!=EOF) { if(n==0||n==1) { printf("1\n"); continue; } sol(n); } return 0; }
HDU-1753-大明A+B
http://acm.hdu.edu.cn/showproblem.php?pid=1753
带小数的大数加法,把整数和小数分开即可
#include<stdio.h> #include<string.h> #include<stdlib.h> int flag1,flag2; //表示小数点的位置 char s1[500],s2[500]; int alen;//整数长度 int blen;//小数长度 int a[500]; //计算小数部分的和 int b[500]; //计算整数部分的和 int max(int x,int y) { return x>y?x:y; } int main() { int i,t,j,temp; while(scanf("%s %s",s1,s2)!=EOF) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); flag1=flag2=-1; for(i=0;i<strlen(s1);i++) { if(s1[i]=='.') { flag1=i; break; } } if(flag1==-1) //如果没有小数点,就放在整数位后 flag1=strlen(s1); for(i=0;i<strlen(s2);i++) { if(s2[i]=='.') { flag2=i; break; } } if(flag2==-1) //如果没有小数点,就放在整数位后 flag2=strlen(s2); t=0; for(i=flag1+1;i<strlen(s1);i++) //小数位正存 a[t++]+=(s1[i]-'0'); t=0; for(i=flag2+1;i<strlen(s2);i++) a[t++]+=(s2[i]-'0'); alen=max(strlen(s1)-flag1-1,strlen(s2)-flag2-1); //小数位长度 for(i=alen-1,temp=0;i>=0;i--) //处理小数部分 { a[i]+=temp; temp=(a[i]/10); a[i]%=10; } if(temp) b[0]+=temp; t=0; for(i=flag1-1;i>=0;i--) //整数位反存 b[t++]+=(s1[i]-'0'); t=0; for(i=flag2-1;i>=0;i--) b[t++]+=(s2[i]-'0'); blen=max(flag1,flag2); //整数位长度 for(i=0,temp=0;i<blen;i++) //处理整数部分 { b[i]+=temp; temp=(b[i]/10); b[i]%=10; } if(temp) //整数位输出 printf("%d",temp); for(i=blen-1;i>=0;i--) printf("%d",b[i]); if(alen<1) { printf("\n"); continue; } for(i=alen-1;i>=0;i--) //小数位输出 { if(a[i]!=0) break; } if(i==-1) printf("\n"); else { printf("."); for(j=0;j<=i;j++) printf("%d",a[j]); printf("\n"); } } return 0; }
HDU-1402-A*B Problem Plus
http://acm.hdu.edu.cn/showproblem.php?pid=1402
呜呜,Time Limit Exceeded,想不出什么优化的方法,先贴个超时的代码,下回再研究,网上说可用傅立叶变换,表示不会用哇
#include<stdio.h> #include<string.h> #include<stdlib.h> char s1[50005],s2[50005]; int s[100005]; int main() { int len1,len2,temp; int i,j; while(scanf("%s%s",s1,s2)!=EOF) { len1=strlen(s1); len2=strlen(s2); memset(s,0,sizeof(s)); for(i=0;i<len1;i++) //模拟乘法 for(j=0;j<len2;j++) s[i+j]+=(s1[len1-1-i]-'0')*(s2[len2-1-j]-'0'); for(i=0,temp=0;i<len1+len2;i++) { s[i]+=temp; temp=(s[i]/10); s[i]%=10; } for(i=len1+len2-1;i>=0;i--) if(s[i]!=0) break; if(i==-1) { printf("0\n"); continue; } for(j=i;j>=0;j--) printf("%d",s[j]); printf("\n"); } return 0; }
POJ-1001-Exponentiation
http://poj.org/problem?id=1001
带小数的幂乘,一样用字符串模拟
#include<stdio.h> #include<string.h> #include<stdlib.h> int main() { int sign,i,t,n,j,k; char s[6]; int b[6],c[300],temp[300]; while(scanf("%s",s)!=EOF) { sign=0; t=1; for(i=0;i<6;i++) { if(s[i]>='0'&&s[i]<='9') { b[t]=s[i]-'0'; c[t]=b[t]; t++; } else b[0]=t-1; } scanf("%d",&n); for(k=1;k<n;k++) //做n-1次正向的乘法 { memset(temp,0,sizeof(temp)); for(i=1;i<=5*k;i++) for(j=1;j<=5;j++) temp[i+j]+=(c[i]*b[j]); for(i=5*(k+1);i>=2;i--) { temp[i-1]+=temp[i]/10; temp[i]%=10; } for(i=1;i<=5*(k+1);i++) c[i]=temp[i]; } b[0]=n*b[0]; //整数位 i=1; while(c[i]==0) i++; j=5*n; while(c[j]==0) j--; for(k=i;k<=b[0];k++) { sign=1; printf("%d",c[k]); } if(b[0]+1<=j) printf("."); for(k=b[0]+1;k<=j;k++) { sign=1; printf("%d",c[k]); } if(sign==0) printf("0"); printf("\n"); } return 0; }
posted on 2012-06-30 23:02 java课程设计例子 阅读(180) 评论(0) 编辑 收藏 举报