请问zoj的一道题

sandbad0x 2009-09-28 08:28:38
对于ZOJ 1205这题来说,为什么会出现这样的错误:Segmentation Fault !
有点摸不着头脑,不仅这一道题出现了....为什么呢?请教一下。。谢谢!
题目是:
题目说明:(把题目从GOOGLE翻译的结果修改而来)

在22世纪,科学家们发现智能居民生活在火星。火星人非常喜欢数学。每一年,他们将举行一次火星算术大赛(计算机) ,竞赛内容是计算两个100位数的和,使用时间最少的人获得冠军。今年,他们还邀请地球上的人参加竞赛。
作为唯一代表地球,你发送给火星以展示人类的力量。幸运的是你带去的的笔记本电脑可以帮助您快速完成工作。现在剩下的问题只是写一个小程序来计算的两个给定数字的和。然而,在你开始写程序前要注意的是,火星人使用20进制数,因为它们通常有20个手指。

输入:
给定一些火星数,每个一行。火星数是由0到9 ,和小写字母 a 至 j 组成的(小写字母a开始分别代表10 , 11 , ... , 19 )。所有给定数字的位数不会超过100 。

输出:
对于每一对数字,在一行中输出它们的和。

样本输入:

1234567890
abcdefghij
99999jjjjj
9999900001

示例输出:

bdfi02467j
iiiij00000



#include<stdio.h>
#include<iostream>
using namespace std;
char a[101],b[101],c[101];
int main()
{
int m,n,k,len,p,q,t;
// freopen("input.txt","r",stdin);
while(scanf("%s%s",&a,&b)!=EOF)
{
t=0;
m=strlen(a); //字符串a长度
n=strlen(b); //字符串b长度
k=0;
if(m>n) //a+b结果的长度
len=m-1;
else
len=n-1;
while(m||n)
{
if(m<0)
p=48; //如果a先运算完毕,置0
else
{
p=(int)a[m-1]; //转化为ASCII码值相加,然后运算,0~9为48~57, a~j为97~106
if(p<58)
p-=48;
else
p-=87;
}
if(n<0)
q=48;
else
{
q=(int)b[n-1];
if(q<58)
q-=48;
else
q-=87;
}
t=p+q+k;
if(t<10) //转化为20进制(包括符合和数字的转换)
c[len--]=t+47;
if(t>=10&&t<20)
c[len--]=t+87;
else if(t>=20&&t<30)
c[len--]=t-20+48;
else
c[len--]=t-20+87;
k=t/20;
m--;
n--;
}
if(k)
printf("%d",k);
printf("%s\n",c);
}
return 0;
}


...全文
224 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sandbad0x 2009-09-30
  • 打赏
  • 举报
回复
自己慢慢调,终于发现是中间代码很多细节错误。不过while(scanf("%s%s",&a,&b)!=EOF) 这句应该也有问题!
xiaoyu821120 2009-09-29
  • 打赏
  • 举报
回复
除0好像也是报这个错
linren 2009-09-29
  • 打赏
  • 举报
回复
建议使用:
while(scanf("%s",a)!=EOF&&scanf("%s",b)!=EOF)
linren 2009-09-29
  • 打赏
  • 举报
回复
可能是这一句的问题:
while(scanf("%s%s",&a,&b)!=EOF)

字符串数组在scanf中不用取地址……
绿色夹克衫 2009-09-29
  • 打赏
  • 举报
回复
这类题最常见的错误是最高位进位的错误,没仔细看LZ代码,LZ自己查查吧!
morilasi 2009-09-29
  • 打赏
  • 举报
回复
段错误,一般是由野指针或数组越界访问造成的。
没看代码,是不是你的数组开的不够?
PeacefulBY 2009-09-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 linren 的回复:]
可能是这一句的问题:
while(scanf("%s%s",&a,&b)!=EOF)

字符串数组在scanf中不用取地址……
[/Quote]
到位了
hhhcj 2009-09-28
  • 打赏
  • 举报
回复
SF有可能是空间溢出之类的。。
我以前用一个很大的递归,结果也出现过这个错误。
另外,我的答案为什么是Wrong Answer??
#include <iostream>
#include <string>
using namespace std;

int main()
{
string str1,str2,str;
int i,j,k,num1,num2;
while(cin>>str1>>str2)
{
str="";k=0;
for(i=str1.length()-1,j=str2.length()-1;i>=0&&j>=0;i--,j--)
{
if(str1[i]>='0'&&str1[i]<='9')
num1=str1[i]-'0';
else
num1=str1[i]-'a'+10;
if(str2[j]>='0'&&str2[j]<='9')
num2=str2[j]-'0';
else
num2=str2[j]-'a'+10;
num1=num1+num2+k;
k=num1/20;
num1%=20;
if(num1<10)
str.insert(0,1,(char)(num1+'0'));
else
str.insert(0,1,(char)(num1+'a'-10));
}
while(i>=0)
{
if(str1[i]>='0'&&str1[i]<='9')
num1=str1[i]-'0';
else
num1=str1[i]-'a'+10;
num1+=k;
k=num1/20;
num1%=20;
if(num1<10)
str.insert(0,1,(char)(num1+'0'));
else
str.insert(0,1,(char)(num1+'a'-10));
i--;
}
while(j>=0)
{
if(str2[j]>='0'&&str2[j]<='9')
num1=str2[j]-'0';
else
num1=str2[j]-'a'+10;
num1+=k;
k=num1/20;
num1%=20;
if(num1<10)
str.insert(0,1,(char)(num1+'0'));
else
str.insert(0,1,(char)(num1+'a'-10));
j--;
}
cout<<str<<endl;
}

system("pause");
return 0;
}

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧