128 - Software CRC

All about problems in Volume 1. If there is a thread about your problem, please use it. If not, create one with its number in the subject.

Moderator: Board moderators

Revenger
Experienced poster
Posts: 132
Joined: Sun Apr 14, 2002 12:27 pm
Location: Russia

128 - Software CRC

Post by Revenger » Mon May 06, 2002 9:52 am

I don't know why I get Runtime Error... I tested my program on many tests but with no results. Please, help me.

Here is my code

[pascal](* Software CRC *)

Program p128;

Const g = 34943;

Var Ch : Char;
S : String;
last,i,j : integer;

begin
While True Do begin
last:=0;
Read(Ch);
if Ch='#' then Break;
While (Not Eof(InPut)) And (Not Eoln(InPut)) do begin
last:=last*256+Ord(Ch);
last:=last mod g;
Read(Ch);
end;
last:=last*256+Ord(Ch);
last:=last mod g;
if Eoln(InPut) then Readln;
for i:=1 to 2 do last:=last*256 mod g;
if last>0 then last:=g-last;
S:='';
for i:=1 to 4 do begin
if i=3 then S:=' '+S;
j:=last mod 16;
last:=last div 16;
if j<10 then S:=Chr(Ord('0')+j)+S else S:=Chr(Ord('A')+j-10)+S;
end;
Writeln(S);
end;
end.[/pascal]

junjieliang
Experienced poster
Posts: 169
Joined: Wed Oct 31, 2001 2:00 am
Location: Singapore

???

Post by junjieliang » Sat Jun 15, 2002 5:42 am

Could someone explain this problem to me, with reference to the sample input? Thanks.

epsilon0
Experienced poster
Posts: 112
Joined: Tue Nov 12, 2002 11:15 pm
Location: Paris, France.

128 Software CRC

Post by epsilon0 » Sun Feb 02, 2003 2:20 pm

is there any trick in this problem?

end of lines are \r\n right?

i don't get it.

[c]#include <stdio.h>
#include <stdlib.h>

#define GGG 34943

void print(int val)
{
printf("%02X %02X\n",val>>8, val - ((val >> 8) <<
8));
}

char solve()
{
char c;
int reminder = 0;
int checksum;
scanf("%c",&c);
if (c == '\r' || c == '\n')
scanf("%c",&c);
while (1)
{
if (c == '#') return 0;
if (c == '\r' || c == '\n') break;
reminder =((reminder * 256) + (int)c) % GGG;
scanf("%c",&c);
}
reminder = (reminder * 256 * 256) % GGG;
checksum = (reminder == 0) ? 0 : GGG - reminder;
print(checksum);
return 1;
}

int main()
{
while (solve());
return EXIT_SUCCESS;
}[/c]
We never perform a computation ourselves, we just hitch a ride on the great Computation that is going on already. --Tomasso Toffoli

nghiank
New poster
Posts: 31
Joined: Wed Nov 20, 2002 3:10 pm
Contact:

Post by nghiank » Sun Feb 02, 2003 3:05 pm

test
Last edited by nghiank on Sun Apr 22, 2007 3:26 pm, edited 1 time in total.

Ivan Golubev
Experienced poster
Posts: 167
Joined: Fri Oct 19, 2001 2:00 am
Location: Saint Petersburg, Russia

Post by Ivan Golubev » Mon Feb 03, 2003 11:49 am

Do not skip blank lines. And there no "\r"'s in unix text files (but it doesn't really matters). Use gets() to read input and everything will be fine.

epsilon0
Experienced poster
Posts: 112
Joined: Tue Nov 12, 2002 11:15 pm
Location: Paris, France.

Post by epsilon0 » Mon Feb 03, 2003 12:55 pm

end of lines seem to be \r\n on my linux box.
removing the \r gives different results. (correct ones).
We never perform a computation ourselves, we just hitch a ride on the great Computation that is going on already. --Tomasso Toffoli

nghiank
New poster
Posts: 31
Joined: Wed Nov 20, 2002 3:10 pm
Contact:

Post by nghiank » Tue Feb 04, 2003 8:49 am

Hi Epsilon0!
My code always get Wa. Why don't you give me the test?
I don't ignore blank spaces, but My code still get Wa.
Test:
Input:
JDJDJDJDJDJ

JDJDJDJ
What's your output?

User avatar
little joey
Guru
Posts: 1080
Joined: Thu Dec 19, 2002 7:37 pm

Post by little joey » Tue Feb 04, 2003 10:01 am

If I feed the text op nghiank's Pascal source (as listed above) with an extra line containing '#' at the end to my accepted program, I get:

Code: Select all

60 D1  38 56  6A C3  7F 54  87 43  7C D3  26 FA  77 B2  00 00
46 74  0B F1  71 99  03 38  41 00  57 51  5B E7  0D 42  4B 7A
4D 8A  3F B0  4A BC  45 5D  00 00  4B A3  06 A9  03 38  10 3F
0D 42  7E 42  45 81  4A BC  47 D9  57 79  64 92  1A 73  44 9F
53 C5  47 78  15 D3  7E 23  7E A0  01 BD  45 5D  00 00  47 15
03 38  1E E7  0D 42  7F 55  1E 6A  16 16  3C 98  15 7A  33 4F
23 47  7C 24  66 20  05 A2  4A BC  45 5D  00 00  05 CB  86 E5
32 B4
Most of the end-of-lines are replaced by double spaces to save space in this message.
Use it as a test.

nghiank
New poster
Posts: 31
Joined: Wed Nov 20, 2002 3:10 pm
Contact:

Post by nghiank » Wed Feb 05, 2003 3:48 pm

kkk
Last edited by nghiank on Sun Apr 22, 2007 3:28 pm, edited 1 time in total.

nghiank
New poster
Posts: 31
Joined: Wed Nov 20, 2002 3:10 pm
Contact:

Post by nghiank » Wed Feb 05, 2003 4:07 pm

test
Last edited by nghiank on Sun Apr 22, 2007 3:28 pm, edited 1 time in total.

User avatar
little joey
Guru
Posts: 1080
Joined: Thu Dec 19, 2002 7:37 pm

Post by little joey » Wed Feb 05, 2003 8:05 pm

:D

debr
New poster
Posts: 3
Joined: Sat Feb 08, 2003 6:36 pm

I get WA on 128 here too

Post by debr » Thu Feb 13, 2003 8:17 am

I've checked against all posted patterns, and I haven't found any problems. What gives here?

[cpp]
#include <iostream>
#include <stdio.h>
using std::cin;

int main () {
unsigned char buffer[1028];
unsigned int modulus = 34943;
while(!cin.eof()) {
cin.getline((char *) buffer,1028,'\n');
if (buffer[0] == '#') { break; }
unsigned int crc=0;
unsigned char *ptr = buffer;
while(*ptr != '\n' && *ptr != '\r') {
crc = 256 * crc + (unsigned int) *ptr;
ptr++; crc %= modulus;
}
// last two byte stuff
crc *= 256; crc %= modulus; crc *= 256; crc %= modulus;
if (crc > 0) { crc = modulus-crc; }
unsigned int msb = crc / 256 ;
unsigned int lsb = crc % 256 ;
printf("%02X %02X\n",msb,lsb);
}
return 0;
}
[/cpp]

boatfish
New poster
Posts: 18
Joined: Thu May 08, 2003 11:46 am

128 time limit exceed

Post by boatfish » Wed Jun 04, 2003 2:48 pm

why??
[cpp]#include<iostream>
#include<string>
using namespace std;

string output(int a){
string result,no="0123456789ABCDEF";
for(int j=1;j<=4;a=a/16,j++){
int i=a%16;
result=no+result;
}
return result.substr(0,2)+" "+result.substr(2);
}

int main(){
string buffer;
int i;
while(true){
string buffer;
char bu;
while(cin.get(bu)){
if(bu=='\n')
break;
buffer=buffer+bu;
}
if(buffer[0]=='#')
return 0;
int length=buffer.length(),base=0,checksum;
if(length==0){
cout<<"00 00"<<endl;
continue;
}
for(i=0;i<length;i++)
base=(base*256+buffer)%34943;
base=(base*256*256)%34943;
checksum= (base==0?base:(34943-base));
cout<<output(checksum)<<endl;
}
return 0;
}[/cpp][/c]

Experimenter
Learning poster
Posts: 76
Joined: Thu Mar 13, 2003 5:12 am
Location: Russia

Upper case

Post by Experimenter » Tue Jun 10, 2003 7:46 pm

I was just wondering if the reason of getting WA might be a printing in a hex format in a low case?
I am solving 128 problem and there you need to output two bytes. that's how I do it.
[cpp]
cout.fill('0');
cout<<hex<<setw(2)<<nHigherByteCRC<<" ";
cout<<hex<<setw(2)<<nLowerByteCRC <<" "<<endl;
[/cpp]
Does anybody know if there is any simplier way to do it and besides to make cout ouput everything in uppercase. [/cpp][/b]

Experimenter
Learning poster
Posts: 76
Joined: Thu Mar 13, 2003 5:12 am
Location: Russia

128

Post by Experimenter » Tue Jun 10, 2003 9:33 pm

Hi, guys.
I was struggling with 128 problem and it seems to work, but I still cannot get AC. the asnwer is WA. my cpp code is below. maybe somebody can give me a hint? or at least some input and output for the input to try?
[cpp]
#include <fstream>
#include <string>
#include <iostream>
#include <iomanip>
#include <memory>
#include <stdio.h>

using namespace std;

typedef unsigned char BOOL;

const BOOL FALSE = 0;
const BOOL TRUE = 1;

int main();
long Reminder(char *chMessage,int nDWLen,long lnGenerator);

int main()
{

const long lnGenerator = 34943;
const int nAddLetters = 4;
const int nDataLen = 1024 + nAddLetters + 2;// 1024 - for the data,
// 2 - for Redundancy Error
// 4 - for correcting the data length (make even)

long r;
long CRC;
int tAdd,tBegin,rem;
int nLowerByteCRC;
int nHigherByteCRC;

char chData[nDataLen];
char *chMessage = NULL;
BOOL fl = TRUE;
int nReadLen = 0;
int nMessageLen= 0;

// ifstream fin("input.txt");

while(fl)
{

memset((void *)chData,0,(size_t)(nDataLen*sizeof(chData[0])));
//fin.getline(&chData[nAddLetters],nDataLen);
cin.getline(&chData[nAddLetters],nDataLen,'\n');
nReadLen = strlen(&chData[nAddLetters]);


if('#' == chData [nAddLetters])
{
fl = FALSE;
}
else
{
rem = (nReadLen + 2)% 4;
tAdd = (!rem) ? 0 : (4 - rem); // number of letters to add
tBegin = (!rem) ? 4 : rem ; // where the message will start
nMessageLen = nReadLen + 2 + tAdd ; // message length
chMessage = (char *)&chData[tBegin];

// calculate CRC

r = Reminder(chMessage,(nMessageLen>>2),lnGenerator);
CRC = (0 == r) ? 0 : (lnGenerator - r);

nHigherByteCRC = CRC>>8;
nLowerByteCRC = CRC & (int)(0x00FF);

//cout.fill('0');
//cout.setf(ios_base::hex,ios_base::showbase);
//cout.setf(1,ios_base::uppercase);
//cout<<hex<<setw(2)<<uppercase<<nHigherByteCRC<<" ";
//cout<<hex<<setw(2)<<uppercase<<nLowerByteCRC <<" "<<endl;
printf("%02X %02X\n",nHigherByteCRC,nLowerByteCRC);
}


}


return (0);
}

long Reminder(char *chMessage,int nDWLen,long lnGenerator)
{
long r,t;
int i;

const int nIter = 2*nDWLen - 1;
r = (int)chMessage[0];
r<<= 8;
r |= chMessage[1];


for(i = 1; i <= nIter; i++)
{
t = r;
t<<= 16;
t |= (((int)chMessage[i<<1])<<8 ) | ((int)chMessage[i*2 + 1]);
r = t % lnGenerator;
}

return r;
}
[/cpp]

Post Reply

Return to “Volume 1 (100-199)”