128 - Software CRC
Moderator: Board moderators
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;
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]
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]
-
- 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.
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]
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
-
- Experienced poster
- Posts: 167
- Joined: Fri Oct 19, 2001 2:00 am
- Location: Saint Petersburg, Russia
-
- 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:
Most of the end-of-lines are replaced by double spaces to save space in this message.
Use it as a test.
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
Use it as a test.
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]
[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]
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]
[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]
-
- 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]
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]
-
- 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 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]
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]