永发信息网

杭电acm1002

答案:3  悬赏:30  手机版
解决时间 2021-01-28 19:14
#include <stdio.h>
#include <string.h>
int main()
{
char a[1000]={0};
char b[1000]={0},c[1001]={0},t;
int i,n,j,k,m,la,lb;
while(scanf("%d",&n)!=EOF)
{
if(n<=20&&n>=1)
{
for(m=0;m<n;m++)
{
scanf("%s %s",&a,&b);
la=strlen(a);
lb=strlen(b);
if(la>lb)
{
k=0;
for(i=la-1,j=lb-1;i>=0;i--,j--)
{
if(j>=0) c[i+1]=(a[i]-'0')+(b[j]-'0')+k;
if(c[i+1]>=10)
{
c[i+1]=c[i+1]-10+'0';
k=1;
}
if(j>=0)
{
if(c[i+1]<10)
{
k=0;
c[i+1]=c[i+1]+'0';
}
}
if(j<0) {
t=a[i]-'0';
c[i+1]=t+k;
if(c[i+1]>=10)
{
c[i+1]=c[i+1]-10+'0';
k=1;
}
else {c[i+1]=c[i+1]+'0';
k=0;}
}
if(i==0&&k==1) c[i]='1';
}
if(c[0]=='0')
{
printf("Case %d:\n",m+1);
printf("%s + %s = ",a,b);
for(i=1;i<=la;i++)
printf("%c",c[i]);
printf("\n");
if(m+1<n) printf("\n");
}
else
{
printf("Case %d:\n",m+1);
printf("%s + %s = ",a,b);
for(i=0;i<=la;i++)
printf("%c",c[i]);
printf("\n");
if(m+1<n) printf("\n");
}
}
else if(la==lb)
{
k=0;
for(i=la-1,j=lb-1;i>=0;i--,j--)
{
if(j>=0) c[i+1]=(a[i]-'0')+(b[j]-'0')+k;
if(c[i+1]>=10)
{
c[i+1]=c[i+1]-10+'0';
k=1;
}
else
{
k=0;
c[i+1]=c[i+1]+'0';
}
}
c[0]='0'+k;
if(c[0]=='0')
{
printf("Case %d:\n",m+1);
printf("%s + %s = ",a,b);
for(i=1;i<=la;i++)
printf("%c",c[i]);
printf("\n");
if(m+1<n) printf("\n");
}
else //if(c[0]!='0')
{
printf("Case %d:\n",m+1);
printf("%s + %s = ",a,b);
for(i=0;i<=la;i++)
printf("%c",c[i]);
printf("\n");
if(m+1<n) printf("\n");
}}
else
{ k=0;
for(i=la-1,j=lb-1;j>=0;i--,j--)
{
if(i>=0) c[j+1]=(a[i]-'0')+(b[j]-'0')+k;
if(c[j+1]>=10)
{ c[j+1]=c[j+1]-10+'0';
k=1;
}
if(i>=0)
{ if(c[j+1]<10)
{ k=0;
c[j+1]=c[j+1]+'0';
} }
if(i<0)
{t=b[j]-'0';
c[j+1]=t+k;
if(c[j+1]>=10)
{
c[j+1]=c[j+1]-10+'0';
k=1;}
else {c[j+1]=c[j+1]+'0';
k=0;}
}
if(j==0&&k==1) c[j]='1';
}
if(c[0]=='0')
{
printf("Case %d:\n",m+1);
printf("%s + %s = ",a,b);
for(j=1;j<=lb;j++)
printf("%c",c[j]);
printf("\n");
if(m+1<n) printf("\n");
}
else
{
printf("Case %d:\n",m+1);
printf("%s + %s = ",a,b);
for(j=0;j<=lb;j++)
printf("%c",c[j]);
printf("\n");
if(m+1<n) printf("\n");
}
}}}
else break;
}
return 0;
}
我也不想}}}这样的啊,可是,这个百度提交问题的时候,限制了字数,我只能省略不换行了啊。 我这个题,数据,我感觉没啥问题。。因为我很详细的测试了下。。
最佳答案
这是修改后的程序,终于传上来了。提交过了
你原来的程序给你一组测试数据: 12345 45你看一下对不对

#include <stdio.h>
#include <string.h>
int main()
{
char a[1000]={0};
char b[1000]={0},c[1000]={0},t;
int i,n,j,k,m,la,lb;
while(scanf("%d",&n)!=EOF)
{
if(n<=20&&n>=1)
{
for(m=0;m<n;m++)
{
for(i=0;i<1000;++i)
c[i]='0';
scanf("%s %s",&a,&b);
la=strlen(a);
lb=strlen(b);
if(la>lb)
{
k=0;
for(i=la-1,j=lb-1;i>=0;i--,j--)
{
if(j>=0)
{
c[i+1]=(a[i]-'0')+(b[j]-'0')+k;
if(c[i+1]>=10)
{
c[i+1]=c[i+1]-10+'0';
k=1;
}
if(c[i+1]<10)
{
k=0;
c[i+1]=c[i+1]+'0';
}
}
if(j<0) {
t=a[i]-'0';
c[i+1]=t+k;
if(c[i+1]>=10)
{
c[i+1]=c[i+1]-10+'0';
k=1;
}
else {
c[i+1]=c[i+1]+'0';
k=0;
}
}
if(i==0&&k==1) c[i]='1';
}
if(c[0]=='0')
{
printf("Case %d:\n",m+1);
printf("%s + %s = ",a,b);
for(i=1;i<=la;i++)
printf("%c",c[i]);
printf("\n");
if(m+1<n) printf("\n");
}
else
{
printf("Case %d:\n",m+1);
printf("%s + %s = ",a,b);
for(i=0;i<=la;i++)
printf("%c",c[i]);
printf("\n");
if(m+1<n) printf("\n");
}
}
else if(la==lb)
{
k=0;
for(i=la-1,j=lb-1;i>=0;i--,j--)
{
if(j>=0)
{
c[i+1]=(a[i]-'0')+(b[j]-'0')+k;
if(c[i+1]>=10)
{
c[i+1]=c[i+1]-10+'0';
k=1;
}
else
{
k=0;
c[i+1]=c[i+1]+'0';
}
}
}
c[0]='0'+k;
if(c[0]=='0')
{
printf("Case %d:\n",m+1);
printf("%s + %s = ",a,b);
for(i=1;i<=la;i++)
printf("%c",c[i]);
printf("\n");
if(m+1<n) printf("\n");
}
else //if(c[0]!='0')
{
printf("Case %d:\n",m+1);
printf("%s + %s = ",a,b);
for(i=0;i<=la;i++)
printf("%c",c[i]);
printf("\n");
if(m+1<n) printf("\n");
}
}
else
{
k=0;
for(i=la-1,j=lb-1;j>=0;i--,j--)
{
if(i>=0)
{
c[j+1]=(a[i]-'0')+(b[j]-'0')+k;
if(c[j+1]>=10)
{ c[j+1]=c[j+1]-10+'0';
k=1;
}
if(c[j+1]<10)
{ k=0;
c[j+1]=c[j+1]+'0';
}
}
if(i<0)
{
t=b[j]-'0';
c[j+1]=t+k;
if(c[j+1]>=10)
{
c[j+1]=c[j+1]-10+'0';
k=1;
}
else {
c[j+1]=c[j+1]+'0';
k=0;
}
}
if(j==0&&k==1) c[j]='1';
}
if(c[0]=='0')
{
printf("Case %d:\n",m+1);
printf("%s + %s = ",a,b);
for(j=1;j<=lb;j++)
printf("%c",c[j]);
printf("\n");
if(m+1<n) printf("\n");
}
else
{
printf("Case %d:\n",m+1);
printf("%s + %s = ",a,b);
for(j=0;j<=lb;j++)
printf("%c",c[j]);
printf("\n");
if(m+1<n) printf("\n");
}
}
}
}
else break;
}
return 0;
}
全部回答
//难度在于解决大数运算的方法和实际操作中 #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; } 止水2010,不会就问。。。
int main() { int t; int len1;=10) { sum[i]-=10,&bb); len1=strlen(aa); len2=strlen(bb); for(i=0;i< sum[i+1]++; } } if(outp==1) printf("\,len2; int num; int i,j; int sop; int outp;,aa; for(i=0; for(i=len1-1,j=0;i>i++) { sum[i]+=a[i]+b[i]; if(sum[i]> scanf(" for(i=len2-1,j=0;i>%d\n" sop=0;i<1005;string.h> int sum[1010],&aa; char bb[1010];0"); printf("%s + %s = ",bb); int b[1010]; int a[1010];n"); outp=1; else if(sum[i]!=0) { sop=1; printf(" printf("case %d:\高精度…… 你的代码我改了一下 出现了比wa高级一点的错误 tle 你没有注意要求 是两行之间需要空行 最后 最前 不能有空行 在hdoj这个算wa不是pe……呵呵 我也吃过亏 至于tle 我就不管了; while(t--) { num++; scanf("%s%s"。高精度版本太多…… my code here #include=0;i--,j++) b[j]=bb[i]-'0',num); printf(" #include<1010;i++) a[i]=b[i]=sum[i]=0;,sum[i]); } } if(sop==0) printf(",sum[i]);\n" char aa[1010];,&t); num=0; outp=0; } return 0; for(i=1002;i>=0;i--,j++) a[j]=aa[i]-'0';n";);=0;i--) { if(sop==1) printf("%d";%d",应该是算法问题
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
rac高可用性一定要linux系统吗
免税商品能否带上飞机
下图为杨清馨在1920年创作的一幅漫画《靠不住
3D 热带鱼水族箱屏幕保护程序3.0 的注册码?
有家的男人追我女朋友,我该怎么办?
云南省丽江的纳西古乐源于汉族的洞经音乐和皇
慷达的意思是什么啊?知道的请说下!
have been +过去分词 跟have+过去分词 有什
科龙冰箱显示errord是什么意思?
【搬】什么搬组词
为什么虾、蟹蒸煮后会变成红色
彩色碧玺手链是否能与玉镯带在同一手
孤俊的意思是什么啊?知道的请说下!
淮安到达州有没有火车直达
【物理实验室器材】高中物理实验室需要哪些器
推荐资讯
骏壮的意思是什么啊?知道的请说下!
微信上减肥达人佳佳,头像是这个的人,是骗子
3.飞机降落时,在短时间内从高处迅速下降,这时
桃源县常德小万美发中心在哪里啊,我有事要去
请问滴滴打车软件怎么样?使用的人多吗?
已经工作了,想读书怎么办
-√7/2和-π/3的大小
你们说去上海打工好还是去浙江好?
宋茜唱的电击翻译成英文怎么拼 百变大咖秀上
如何让头发在不烫的情况下变的蓬松?
劳动合同,直系亲属代签,法律认可么
朱自清 朱自清的哪篇文章里有带“轻轻的我
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?