Page 8 of 12

Posted: Tue Jan 03, 2006 9:38 pm
by mamun
Well, I've found more reasonable error. In convert() you cannot do

Code: Select all

char * aux = strcpy(aux,&c);
You have to allocate memory for aux. And passing &c as parameter in this case may be risky. You don't know where the NULL character is in the memory.

Posted: Tue Jan 03, 2006 9:41 pm
by Schutzstaffel
That doesn't make sense for some reasons:

1 - there is always a char '\0' since strcpy puts it and also the function trim takes care of that.

2-

Code: Select all

0823025713
if it's this line with no trailing or leading spaces that crashes because it has exactly lenght 10 then why didn't it crash sooner since

Code: Select all

1234567890
comes first and also hash lenght 10?

3- assuming that's the problem then if I change the condition in the loop of verifyChars to :

Code: Select all

unsigned int size =strlen(line);
  while (i != size+1)
  {
it should be ok but it gives RE anyway. :?
Did I miss something?
Thanks again.

EDIT: just checked your last post and you're right, it must be that! Going to try that now, thanks once again

Posted: Tue Jan 03, 2006 9:46 pm
by Schutzstaffel
Yeah it was the missing malloc :P
Thanks a lot, got AC.
Code edited.

Edit: just a note, I've just realised I didn't need any strcpy afterall, I can use the reference to the char directly in function atoi isntead of a copy of the char in a char * (really dumb of me to only notice this now :oops: )

333 strange.........

Posted: Sat Jan 28, 2006 10:29 am
by Wei-Ming Chen
I got WA, why?

#include <stdio.h>
#include <string.h>
int main()
{
char x[100],y;
int a,b,c,d,e,f[15],g,h;
while(gets(x))
{
a=strlen(x);
c=0;
d=0;
g=-1;
for(b=0;b<a;b++)
{
if(x[b]==' ')
{
if(d==0)
{
g=b;
}
else if(d!=0 && d!=10)
{
c=1;
break;
}
}
else if(x[b]=='-')
{
continue;
}
else if(x[b]=='X')
{
if(d==9)
{
d++;
f[d]=10;
}
else
{
c=1;
break;
}
}
else if(48<=x[b]<=57)
{
if(d<10)
{
d++;
f[d]=x[b]-48;
}
else
{
c=1;
break;
}
}
else
{
c=1;
break;
}
}
for(d=2;d<=10;d++)
{
f[d]+=f[d-1];
}
for(d=2;d<=10;d++)
{
f[d]+=f[d-1];
}
if(f[10]%11!=0)
{
c=1;
}
if(g==a-1)
{
printf(" is incorrect.\n");
continue;
}
for(h=a-1;h>=0;h--)
{
if(x[h]!=' ')
{
break;
}
}
for(d=g+1;d<=h;d++)
{
printf("%c",x[d]);
}
printf(" is ");
if(c==1)
{
printf("in");
}
printf("correct.\n");
}
return 0;
}

Posted: Sat Jan 28, 2006 12:18 pm
by mamun
Have a look at http://online-judge.uva.es/board/viewto ... 0253#40253 8)
OK, I'll repost.
Try to pass the following inputs

Code: Select all

0-89237-010-6
0-89237-010 -6
0-1-3-1-6-2-9-5-9-X
0abc-13dfasdfa-162959-X
    0-13-162959-X    	 // leading/trailing spaces
0-13-162959-X 0-13-162959-X
0-13-162959-X1
-------0-89237-010-6--------
0-89237-010-6XXXX
0-89237-010-6-150
				            // blank line
0-89237-010- 6 TEST
Output should be

Code: Select all

0-89237-010-6 is correct.
0-89237-010 -6 is correct.
0-1-3-1-6-2-9-5-9-X is correct.
0abc-13dfasdfa-162959-X is correct.
0-13-162959-X is correct.
0-13-162959-X 0-13-162959-X is incorrect.
0-13-162959-X1 is incorrect.
-------0-89237-010-6-------- is correct.
0-89237-010-6XXXX is incorrect.
0-89237-010-6-150 is incorrect.
 is incorrect.
0-89237-010- 6 TEST is incorrect.

Posted: Sat Jan 28, 2006 3:19 pm
by Wei-Ming Chen
I know you have posted.
When I tried, another person told me that the second input could be correct or incorrect.
And I didn't know why the input code is correct.....
By the way, I changed the code and used these inputs, and they were right.
But when I sumbit, WA again.

Posted: Sat Jan 28, 2006 6:03 pm
by mamun
Did you look at other threads regarding this? Look at http://online-judge.uva.es/board/viewtopic.php?t=9650. Some more hints may also be present. Search!

Posted: Sun Jan 29, 2006 12:31 pm
by Wei-Ming Chen
Can you tell me why the fourth input is correct?
I thought it is incorrect.

Posted: Sun Jan 29, 2006 5:53 pm
by IRA
why the fourth input is correct?
???

Posted: Mon Jan 30, 2006 12:03 pm
by mamun
IRA & Wei-Ming Chen wrote:why the fourth input is correct?
???
According to my implementation, valid ISBN may contain illegal characters like small letters but not capital except X at 10th position.

Posted: Tue Jan 31, 2006 8:27 am
by Wei-Ming Chen
I went to see that page and changed my code.
But WA......
I'm confused,I didn't think my code wrong.

#include <stdio.h>
#include <string.h>
int main()
{
char x[100],y;
int a,b,c,d,e,f[15],g,h;
while(gets(x))
{
a=strlen(x);
c=0;
d=0;
g=-1;
for(b=0;b<a;b++)
{
if(x[b]==' ')
{
if(d==0)
{
g=b;
}
}
else if(x[b]=='X')
{
if(d==9)
{
d++;
f[d]=10;
}
else
{
c=1;
break;
}
}
else if(48<=x[b] && x[b]<=57)
{
if(d<10)
{
d++;
f[d]=x[b]-48;
}
else
{
c=1;
break;
}
}
else if(x[b]>=65 && x[b]<=90)
{
c=1;
break;
}
else
{
continue;
}
}
for(d=2;d<=10;d++)
{
f[d]+=f[d-1];
}
for(d=2;d<=10;d++)
{
f[d]+=f[d-1];
}
if(f[10]%11!=0)
{
c=1;
}
if(g==a-1)
{
printf(" is incorrect.\n");
continue;
}
for(h=a-1;h>=0;h--)
{
if(x[h]!=' ')
{
break;
}
}
for(d=g+1;d<=h;d++)
{
printf("%c",x[d]);
}
printf(" is ");
if(c==1)
{
printf("in");
}
printf("correct.\n");
}
return 0;
}

333-WA?

Posted: Thu Feb 23, 2006 2:32 pm
by totobogy
Hi. Plz help with this code. I get a WA but I tested all the cases available.

Code: Select all

#include<stdio.h>

int isdigit(char c)
{
	switch(c)
 	{
 	case '0': return 0;
  	case '1': return 1;
    	case '2': return 2;	
     	case '3': return 3;	
      	case '4': return 4;	
       	case '5': return 5;	
       	case '6': return 6;	
       	case '7': return 7;	
       	case '8': return 8;	
       	case '9': return 9;
       	//case 'x': return 10;
       	case 'X': return 10;
        default: return -1;
        
     }
}		
	
int main()
{
	int i=0,n;   
	char c;
	int s1 =0, s2 =0;
	
	while((c=getchar())!=EOF)/*till EOF*/
	{
		i=0;
		s1=0;
		s2=0;
		while(c!='\n' && c!=EOF)/*new ISBN*/
		{
			if(c != ' ')/*Leave out the spaces, print everything else*/
				printf("%c",c);	
		
		    if((n=isdigit(c))!= -1) /*If character is a digit*/
		    {
		    	i++; /*count digits*/
		    	s1 += n; /*Partial Sums*/
		    	s2 += s1;
			}
		
		    c = getchar();
		
	    }
	  
	    if(i==10 && s2%11 == 0)
	    	printf(" is correct.\n");
	  
 		else /*If i><10 or s2%11 != 0*/
	  		printf(" is incorrect.\n");

    }
	return 0;
}
		

Posted: Wed Aug 23, 2006 2:39 am
by Erik
Hi,

what about the following case:

Code: Select all

0000-0000-X2
Cu, Erik :D

333.....WA

Posted: Thu Sep 21, 2006 10:35 am
by silver
i am a novice programmer....i am trying uva problem 333....but it is WA :( :(
anyone plzz help me....
here is my code

Code: Select all

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
int main()
{
	char str[81],str1[80],str2[80];
	int x,p,flag,i,fal,S[80],S2[80],a,l1,l2,arr[80],N,N1,N2,arr2[80];
	while(gets(str))
	{
		l1=strlen(str);
		if(l1==0)flag=0;
		fal=0;
		a=0;
		p=0;
		x=0;
		for(i=0;i<l1;i++)
		{
			
			if(a==10 && str[i]=='X' && x!=1)
			{
				arr[a]=10;
				x=1;
				flag=1;
			}
			if(isdigit(str[i])>0)
				{
					
					arr[a]=(str[i]-'0');
					
					a++;
					
					flag=1;
				}
				
			if(isspace(str[i])==0)
			{str1[p]=str[i];p++;}	 	 
			else fal++;
		}
		str1[p]='\0';
		if(fal==(l1-1))flag=0;
		 
		if(a>10)flag==0;
		if(flag==1)
		{
		S[0]=arr[0];
		S2[0]=S[0];
		for(i=1;i<a;i++)
		{
			S[i]=S[i-1]+arr[i];
			
			
			S2[i]=S2[i-1]+S[i];
		}
		
		sprintf(str2,"%d",S2[i]);
		l2=strlen(str2);
		N1=0;
		for(i=0;i<l2;i++)
		{
			arr2[i]=(str2[i]-'0');
		}
		for(i=0;i<l2;i+=2)
		{
			N1=N1+arr2[i];
		}
		N2=0;
		for(i=1;i<l2;i+=2)
		{
			N2=N2+arr2[i];
		}
		
		N=0;
		N=abs(N1-N2);
		if((N%11)==0)
		printf("%s is correct.\n",str1);
		else if((N%11)!=0){printf("%s is incorrect.\n",str1);}
		}
		else if(flag==0){printf("%s is incorrect.\n",str1);}
	
	}
	return 0;
}

Re: 333 - PE - but why?

Posted: Wed Oct 04, 2006 9:08 pm
by Sumon
Karthekeyan wrote:Here's my code that gives presentation error with oj.... is it because of the endl on seeing eof??
I think you have printed the trailing spaces of the input string and getting PE.

In general,the leading and trailing spaces must be deleted when print the input string as output.

Warning: No,spaces inside the string should be deleted.