## 128 - Software CRC

Moderator: Board moderators

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

### 128 - Software CRC

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;
if Ch='#' then Break;
While (Not Eof(InPut)) And (Not Eoln(InPut)) do begin
last:=last*256+Ord(Ch);
last:=last mod g;
end;
last:=last*256+Ord(Ch);
last:=last mod g;
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

### ???

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

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 >> <<
);
}

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:
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
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.
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:
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
little joey
Guru
Posts: 1080
Joined: Thu Dec 19, 2002 7:37 pm
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:
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:
test
Last edited by nghiank on Sun Apr 22, 2007 3:28 pm, edited 1 time in total.
little joey
Guru
Posts: 1080
Joined: Thu Dec 19, 2002 7:37 pm
debr
New poster
Posts: 3
Joined: Sat Feb 08, 2003 6:36 pm

### I get WA on 128 here too

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

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

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

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 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 nLowerByteCRC;
int nHigherByteCRC;

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

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

while(fl)
{

memset((void *)chData,0,(size_t)(nDataLen*sizeof(chData[0])));

{
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
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]