/*
1002 A + B Problem II
Time Limit : 1000 ms Memory Limit : 32768 K Output Limit : 1024 K
VC
*/
//难度在于解决大数运算的方法和实际操作中
#include <stdio.h>
#include <stdlib.h>
#define DIV 4
#define NUMLONG 1000
#define TMAX 20
short deadd[TMAX]={0};
short flag=0;
int ChangetoNum(char * pstr,short * pnum,short now)
{
short ca=0,cb=3;
char divstr[DIV+1];
divstr[DIV]='\0';
if(*pstr=='-')
{
deadd[now]++;
pstr++;
}
while(pstr[ca]!='\0') ca++;
pnum[0]=ca-ca%DIV;
if(pnum[0]==0)//判断是否不足一个保存单元
pnum[0]=1;
else if(pnum[0]==ca)//判断是否没有零碎的保存单元
pnum[0]=(ca-ca%DIV)/DIV;
else
pnum[0]=(ca-ca%DIV)/DIV+1;
//pnum[0]保存数字的保存长度
pnum++;;
while((ca--)>=0)
{
if(cb<0)
{
*pnum=(short)atoi(divstr);//分段字符串转换为数字
pnum++;
cb=3;
divstr[cb--]=pstr[ca];
}
else if(ca<0 && cb<3)//无法合成一整段的字符串转换
{
while(cb>=0)
divstr[cb--]='0';
*pnum=(short)atoi(divstr);
}
else
divstr[cb--]=pstr[ca];
}
return 0;
}
int Calculate(short *pnum1,short *pnum2,short *pans)
{
short ca,n,temp;
if(pnum1[0]<pnum2[0])
n=pnum2[0];
else
n=pnum1[0];
for(ca=1;ca<=n;ca++)
{
temp=pnum1[ca]+pnum2[ca]+pans[ca];
if(temp>=10000)//结果数字有进位
{
pans[ca]=temp-10000;
pans[ca+1]=1;
pans[0]=ca+1;
}
else
pans[ca]=temp;
}
pans[0]=pans[0]<=n?n:pans[0];
return 0;
}
int Calculate2(short *pnum1,short *pnum2,short *pans)//pnum1为大数
{
short ca,n,temp;
n=pnum1[0];
pans[0]=n;
for(ca=1;ca<=n;ca++)
{
temp=pnum1[ca]-pnum2[ca]-pans[ca];
if(temp==0 && ca==n)
pans[0]=n-1;
if(temp<0)//结果数字要退位
{
if(pnum1[ca+1]>0)
{
pans[ca]=temp+10000;
pans[ca+1]=1;
}
}
else
pans[ca]=temp;
}
return 0;
}
int PrintAns(char *pleft,char *pright,short *pans,short ca)
{
short cb,temp;
printf("Case %d:\n",ca);
printf("%s + %s = ",pleft,pright);
if(flag==1) //首单元输出特殊化
printf("%d",-pans[pans[0]]);
else
printf("%d",pans[pans[0]]);
for(ca=pans[0]-1;ca>=1;ca--)
{
if(pans[ca]>=1000)//4位全满
printf("%d",pans[ca]);
else
{
//if(ca<pans[0])//判断是否为第一个单元
{
temp=pans[ca];
for(cb=0;temp>0;cb++)//输出数字中间的0
temp/=10;
for(;cb<4;cb++)
printf("0");
}
if(pans[ca]!=0) printf("%d",pans[ca]);//当此单元为0时,0已经输出完毕,就不用再输出了
}
}
printf("\n");
return 0;
}
short WhoBig(short *pnum1,short *pnum2)
{
short ca;
if(pnum1[0]>pnum2[0])
return 1;
else
if(pnum1[0]<pnum2[0])
return -1;
for(ca=pnum1[0];ca>=1;ca--)
{
if(pnum1[ca]==pnum2[ca])
continue;
if(pnum1[ca]>pnum2[ca])
return 1;
else
return -1;
}
return 0;
}
int main()
{
short n,ca,big;
char strleft[TMAX][NUMLONG+1],strright[TMAX][NUMLONG+1];
short numleft[TMAX][NUMLONG/DIV]={0},numright[TMAX][NUMLONG/DIV]={0};
short ans[TMAX][NUMLONG/DIV]={0};
scanf("%d",&n);
ca=0;
while(ca<n && scanf("%s %s",strleft[ca],strright[ca])==2)
{
ChangetoNum(strleft[ca],numleft[ca],ca);//正正为3,正负为4,负正为1,负负为2
if(deadd[ca]==0)
deadd[ca]=3;
ChangetoNum(strright[ca],numright[ca],ca);
ca++;
}//while输入数据
for(ca=0;ca<n;ca++)
{
switch(deadd[ca])
{
case 3:
Calculate(numleft[ca],numright[ca],ans[ca]);
flag=0;
break;
case 2:
Calculate(numleft[ca],numright[ca],ans[ca]);
flag=1;
break;
case 4:
case 1:
big=WhoBig(numleft[ca],numright[ca]);
if(big==0)
{
printf("Case %d:\n",ca+1);
printf("%s + %s = 0\n",strleft[ca],strright[ca]);
continue;
}
else
if(big==1)//左边的数大于右边的数
{
Calculate2(numleft[ca],numright[ca],ans[ca]);
if(deadd[ca]==4)//正负
flag=0;
else
if(deadd[ca]==1)//负正
flag=1;
}
else
if(big==-1)//右边的数大于左边的数
{
Calculate2(numright[ca],numleft[ca],ans[ca]);
if(deadd[ca]==4)//正负
flag=1;
else
if(deadd[ca]==1)//负正
flag=0;
}
break;
}
PrintAns(strleft[ca],strright[ca],ans[ca],ca+1);
if(ca!=n-1)
printf("\n");
}//for处理数据
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
杭电acm ac代码
共313个文件
cpp:297个
c:16个
5星 · 超过95%的资源 需积分: 10 12 下载量 188 浏览量
2010-04-12
16:27:49
上传
评论 1
收藏 186KB RAR 举报
温馨提示
将资料汇总了一下,里面大概有400多个,但有一些是重复的,可以参照着看。
资源推荐
资源详情
资源评论
收起资源包目录
杭电acm ac代码 (313个子文件)
1002 A + B Problem II.c 4KB
1003n.c 3KB
1003 Max Sum.c 2KB
1048 The Hardest Problem Ever.c 1KB
1020 Encoding.c 1KB
1040 As Easy As A+B.c 941B
1096.c 559B
1003.c 539B
1093.c 528B
1092.c 428B
1090.c 407B
1094.c 400B
1091.c 387B
1021 Fibonacci Again.c 311B
1089.c 266B
1095.c 265B
1286.cpp 50KB
1058.cpp 50KB
2139.cpp 49KB
2098.cpp 26KB
2051.cpp 10KB
1290.cpp 8KB
1431.cpp 6KB
1023 Train Problem II.cpp 5KB
1074 Doing Homework.cpp 3KB
1041 Computer Transformation.cpp 3KB
1073 Online Judge.cpp 2KB
1006 Tick and Tick.cpp 2KB
1058 Humble Numbers.cpp 2KB
1022 Train Problem I.cpp 2KB
1027 Ignatius and the Princess II.cpp 2KB
1088 Write a simple HTML Browser.cpp 2KB
1075 What Are You Talking About.cpp 2KB
1009n.cpp 2KB
1142.cpp 2KB
1082 Matrix Chain Multiplication.cpp 2KB
1010 Tempter of the Bone.cpp 2KB
1010f.cpp 2KB
1042 N!.cpp 2KB
1238.cpp 2KB
1086 You can Solve a Geometry Problem too.cpp 1KB
1016 Prime Ring Problem.cpp 1KB
1084 What Is Your Grade.cpp 1KB
1059 Dividing.cpp 1KB
1085 Holding Bin-Laden Captive!.cpp 1KB
2027.cpp 1KB
1025 Constructing Roads In JGShining's Kingdom.cpp 1KB
1030 Delta-wave.cpp 1KB
1039 Easier Done Than Said.cpp 1KB
2005.cpp 1KB
1070 Milk.cpp 1KB
1051 Wooden Sticks.cpp 1KB
2027.cpp 1KB
1028 Ignatius and the Princess III.cpp 1KB
1018 Big Number.cpp 1KB
1035 Robot Motion.cpp 1KB
1019 Least Common Multiple.cpp 1KB
1009.cpp 1KB
1009.cpp 1KB
1014 Uniform Generator.cpp 1KB
2023.cpp 1KB
2014WA.cpp 1KB
1009 FatMouse' Trade.cpp 1KB
1003.cpp 1KB
1028s.cpp 1KB
1716.cpp 1KB
1017 A Mathematical Curiosity.cpp 1017B
2023.cpp 1014B
1004 Let the Balloon Rise.cpp 1005B
1032 The 3n + 1 problem.cpp 990B
1071 The area.cpp 982B
1013 Digital Roots.cpp 977B
1015 Safecracker.cpp 945B
2034.cpp 941B
1034 - Candy Sharing Game.cpp 901B
2111.cpp 901B
2089.cpp 891B
2023WA.cpp 890B
2074.cpp 888B
1421.cpp 888B
1176.cpp 883B
1228.cpp 878B
1049b.cpp 873B
2010.cpp 867B
2010.cpp 867B
1052 Tian Ji -- The Horse Racing.cpp 859B
1087 Super Jumping! Jumping! Jumping!.cpp 856B
1062 Text Reverse.cpp 827B
2164.cpp 827B
1019.cpp 821B
1003nb.cpp 812B
1060 Leftmost Digit.cpp 811B
1061 Rightmost Digit.cpp 779B
2055.cpp 778B
1029 Ignatius and the Princess IV.cpp 772B
1088.cpp 768B
1159.cpp 746B
1076 An Easy Task.cpp 737B
1935.cpp 731B
2009.cpp 730B
共 313 条
- 1
- 2
- 3
- 4
资源评论
- gcvin2013-12-19很好。。对于学C++的孩子很有用
jkl352006
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功