这种大数题以后还是不要用C来模了。不然签到题都能成手速题。
HDU-1000:
没什么好说的,还能有wa的,吓老子一跳。
HDU-1002
思路:按题意模拟即可,比较1、2串的长度分类方便模拟,注意HDU的格式问题。
#include <cstdio> #include <iostream> #include <string> #include <cstring> #include <algorithm> using namespace std; int main() { int t; int gg=0; scanf("%d",&t); int q=1; while(t--) { char a[2007]; char b[2007]; char sum[1007]; int o=0; scanf("%s%s",a,b); printf("Case %d:\n",q++); int la=strlen(a); int lb=strlen(b); for(int i=0;i<la;i++) { a[i]-='0'; printf("%d",a[i]); } printf(" + "); for(int i=0;i<lb;i++) { b[i]-='0'; printf("%d",b[i]); } printf(" = "); int cot=0; if(la>lb) { int j=lb-1; for(int i=la-1;i>=0;i--) { int k=b[j]; if(j<0) k=0; //printf("a:%d b:%d cot:%d\n",a[i],k,cot); a[i]+=(k+cot); cot=0; if(a[i]>=10) { cot=a[i]/10;//进位 sum[o++]=a[i]%10;//取余 } else { sum[o++]=a[i]; } j--; } if(cot!=0) sum[o++]=cot; } else { int j=la-1; for(int i=lb-1;i>=0;i--) { int k=a[j]; if(j<0) k=0; //printf("a:%d b:%d cot:%d\n",k,b[i],cot); b[i]+=(k+cot); cot=0; //printf("b:%d\n",b[i]); if(b[i]>=10) { cot=b[i]/10;//进位 sum[o++]=b[i]%10;//取余 b[i]%=10; } else sum[o++]=b[i]; j--; } if(cot!=0) sum[o++]=cot; } for(int i=o-1;i>=0;i--) { printf("%d",sum[i]); } //printf("t:%d",t); printf("\n"); if(t!=0) printf("\n"); } return 0; }
HDU-1060:
思路:乍看之下大数题,然而直接暴力模拟必Time Limit Exceed。用JAVA就不说了,所有大数题在JAVA面前都是A+B。队友教我数学降维,看的我目瞪口呆。
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> using namespace std; typedef long long LL; int main() { int t; scanf("%d",&t); while(t--!=0) { LL n; scanf("%lld",&n); double m=n*log10(n)*1.0; m=m-(LL)m; m=pow(10,m); //cout<<m<<endl; printf("%d\n",(int)(floor(m))); } return 0; }
HDU-1250:
思路:JAVA秒过题,模拟==掉分。
#include <iostream> #include <cstdio> #include <string> #include <math.h> using namespace std; int main() { int n; while(cin >> n){ int num[5][2005] = {0}; num[0][0] = 1; num[1][0] = 1; num[2][0] = 1; num[3][0] = 1; int sum, j; int len = 1; for(int i = 4; i < n; i++){ sum = 0; for(j = 0; j < len; j++){ sum += num[(i - 4) % 5][j] + num[(i - 3) % 5][j] + num[(i - 2) % 5][j] + num[(i - 1) % 5][j]; num[i % 5][j] = sum % 10; sum /= 10; } while(sum){ num[i % 5][j++] = sum % 10; sum /= 10; } len = j; } len--; for( ; len >= 0; len--){ printf("%d", num[(n - 1) % 5][len]); } printf("\n"); } return 0; }
HDU-1715:
和上题没咋变,把a[2],a[3]改改就可以了。
HDU-1753:
思路:带小数的大数加法题,依然JAVA秒过,带顺带能直接函数处理后缀0。
c++码:
#include <cstdio> #include <iostream> #include <cstring> using namespace std; int main() { char a[1007],b[1007]; int a1[1007],a2[1007],b1[1007],b2[1007],p1,p2,lena,lenb,i,j,point1,point2; while(scanf("%s%s",a,b)!=EOF) { memset(a1,0,sizeof(a1)); memset(a2,0,sizeof(a2)); memset(b1,0,sizeof(b1)); memset(b2,0,sizeof(b2)); lena=strlen(a); lenb=strlen(b); p1=lena; for(i=0;i<lena;i++){ if(a[i]=='.'){ p1=i; break; } } p2=lenb; for(i=0;i<lenb;i++){ if(b[i]=='.'){ p2=i; break; } } for(i=0;i<p1;i++){ a1[p1-1-i]=a[i]-'0'; } for(j=0,i=p1+1;i<lena;i++,j++){ a2[j]=a[i]-'0'; } for(i=0;i<p2;i++){ b1[p2-1-i]=b[i]-'0'; } for(j=0,i=p2+1;i<lenb;i++,j++){ b2[j]=b[i]-'0'; } for(i=400;i>0;i--){ a2[i]=a2[i]+b2[i]; if(a2[i]>=10){ a2[i]-=10; a2[i-1]++; } } a2[i]=a2[i]+b2[i]; if(a2[i]>=10){ a2[i]-=10; a1[0]++; } point1=-1; for(i=400;i>=0;i--){ if(a2[i]!=0){ point1=i; break; } } lena=p1;lenb=p2; int len=lena>lenb?lena:lenb; for(i=0;i<len;i++){ a1[i]+=b1[i]; if(a1[i]>=10){ a1[i]-=10; a1[i+1]++; } } point2=0; for(j=i;j>=0;j--){ if(a1[j]!=0){ point2=1; } if(point2){ printf("%d",a1[j]); } } if(point2==0){ printf("0"); } if(point1!=-1){ printf("."); for(i=0;i<=point1;i++){ printf("%d",a2[i]); } } cout<<endl; } return 0; }
UVA 424:
和B题类似,累加就可以了。
#include <cstdio> #include <iostream> #include <string> #include <cstring> #include <algorithm> using namespace std; char a[10007]; char b[10007]; int main() { int ok=1; int cn=0; while(scanf("%s",a)!=EOF) { if(a[0]=='0') break; int l=strlen(a); if(ok) { for(int i=l-1;i>=0;i--) { a[i]-='0'; b[cn]+=a[i]; cn++; } ok=0; } //printf("%d\n",cn); else{ for(int i=0;i<l;i++) a[i]-='0'; if(cn>l) { int j=l-1; int i; int cot=0; for(i=0;i<=cn;i++) { if(l-1<0) a[l-1]=0; b[i]+=a[l-1]+cot; cot=0; if(b[i]>=10) { cot=b[i]/10; b[i]%=10; } //printf("b:%d\n",b[i]); l--; } if(cot) { b[i]++; cot=0; } } else { int i; int j=l-1; int cot=0; for(i=0;i<l;i++) { b[i]+=(a[j]+cot); cot=0; if(b[i]>=10) { cot=b[i]/10; b[i]%=10; } //printf("b:%d\n",b[i]); j--; } if(cot) { b[i]++; cn=max(i,cn); cot=0; } } } } for(int i=cn;i>=0;i--) { if(i==cn&&b[i]==0) continue; printf("%d",b[i]); } printf("\n"); return 0; }
总结:
其他三题没过。(实在是模不动了
JAVA的签到题,c++的手速题。