这种大数题以后还是不要用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++的手速题。