first commit of version ported line by line from python
Not working correctly yet, errors when handling certain predigits
This commit is contained in:
commit
aac5409a72
6 changed files with 156 additions and 0 deletions
2
.depend
Normal file
2
.depend
Normal file
|
@ -0,0 +1,2 @@
|
|||
main.o: main.cpp Spigot.hpp
|
||||
Spigot.o: Spigot.cpp Spigot.hpp
|
39
.gitignore
vendored
Normal file
39
.gitignore
vendored
Normal file
|
@ -0,0 +1,39 @@
|
|||
# Created by https://www.toptal.com/developers/gitignore/api/c++
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=c++
|
||||
|
||||
### C++ ###
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Compiled Object files
|
||||
*.slo
|
||||
*.lo
|
||||
*.o
|
||||
*.obj
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Compiled Dynamic libraries
|
||||
*.so
|
||||
*.dylib
|
||||
*.dll
|
||||
|
||||
# Fortran module files
|
||||
*.mod
|
||||
*.smod
|
||||
|
||||
# Compiled Static libraries
|
||||
*.lai
|
||||
*.la
|
||||
*.a
|
||||
*.lib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/c++
|
||||
|
28
Makefile
Normal file
28
Makefile
Normal file
|
@ -0,0 +1,28 @@
|
|||
CC=gcc
|
||||
CXX=g++
|
||||
RM=rm -f
|
||||
CPPFLAGS=-ggdb -Og -Wall
|
||||
LDFLAGS=-g
|
||||
LDLIBS=-lm
|
||||
|
||||
SRCS=main.cpp Spigot.cpp
|
||||
OBJS=$(subst .cpp,.o,$(SRCS))
|
||||
|
||||
all: main
|
||||
|
||||
main: $(OBJS)
|
||||
$(CXX) $(LDFLAGS) -o main $(OBJS) $(LDLIBS)
|
||||
|
||||
depend: .depend
|
||||
|
||||
.depend: $(SRCS)
|
||||
$(RM) ./.depend
|
||||
$(CXX) $(CPPFLAGS) -MM $^>>./.depend
|
||||
|
||||
clean:
|
||||
$(RM) $(OBJS)
|
||||
|
||||
distclean: clean
|
||||
$(RM) *~ .depend
|
||||
|
||||
include .depend
|
54
Spigot.cpp
Normal file
54
Spigot.cpp
Normal file
|
@ -0,0 +1,54 @@
|
|||
#include <iostream>
|
||||
#include "Spigot.hpp"
|
||||
|
||||
Spigot::Spigot(int requestedNumDigits) {
|
||||
/* create list for number of digits times 10 / 3 */
|
||||
this->spigotListLength = (requestedNumDigits * 10) / 3;
|
||||
this->spigotList.resize(this->spigotListLength, 2); // list is initialized with all 2
|
||||
this->carry = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
void Spigot::pump(void) {
|
||||
int tempPreDigit = 0;
|
||||
int i = this->spigotListLength - 1;
|
||||
while(i >= 0) {
|
||||
this->spigotList[i] *= 10;
|
||||
i--;
|
||||
}
|
||||
this->carry = 0;
|
||||
i = this->spigotListLength - 1;
|
||||
// note this does *not* handle the i=0 case
|
||||
while(i > 0) {
|
||||
this->spigotList[i] += this->carry;
|
||||
this->carry = (this->spigotList[i] / (i * 2 + 1)) * i;
|
||||
this->spigotList[i] = this->spigotList[i] % (i * 2 + 1);
|
||||
i--;
|
||||
}
|
||||
// special case of i = 0
|
||||
this->spigotList[0] += this->carry;
|
||||
tempPreDigit = this->spigotList[0] // 10;
|
||||
this->spigotList[0] -= (tempPreDigit * 10);
|
||||
|
||||
// handle the cases depending on the tempPreDigit
|
||||
if(tempPreDigit >= 0 && tempPreDigit <= 8) {
|
||||
// output all predigits
|
||||
for(long unsigned int j = 0; j < this->preDigits.size(); j++) {
|
||||
std::cout << this->preDigits.back();
|
||||
this->preDigits.pop_back();
|
||||
}
|
||||
this->preDigits.insert(this->preDigits.begin(), tempPreDigit);
|
||||
} else if(tempPreDigit == 9) {
|
||||
this->preDigits.insert(this->preDigits.begin(), tempPreDigit);
|
||||
} else if(tempPreDigit == 10) {
|
||||
tempPreDigit = 0;
|
||||
for(long unsigned int j = 0; j < this->preDigits.size(); j++) {
|
||||
std::cout << (this->preDigits.back() + 1) % 10;
|
||||
this->preDigits.pop_back();
|
||||
}
|
||||
this->preDigits.insert(this->preDigits.begin(), tempPreDigit);
|
||||
} else {
|
||||
std::cout << "We should never have gotten here -- shit has hit the fan!" << std::endl;
|
||||
}
|
||||
return;
|
||||
}
|
23
Spigot.hpp
Normal file
23
Spigot.hpp
Normal file
|
@ -0,0 +1,23 @@
|
|||
#ifndef Spigot_h
|
||||
#define Spigot_h
|
||||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
class Spigot {
|
||||
public:
|
||||
/* functions */
|
||||
Spigot(int requestedNumDigits);
|
||||
void pump(void);
|
||||
|
||||
private:
|
||||
int numDigits;
|
||||
std::vector<int> spigotList;
|
||||
int spigotListLength;
|
||||
int carry;
|
||||
std::vector<int> preDigits;
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif
|
10
main.cpp
Normal file
10
main.cpp
Normal file
|
@ -0,0 +1,10 @@
|
|||
#include <iostream>
|
||||
#include "Spigot.hpp"
|
||||
|
||||
int main(void) {
|
||||
Spigot *piSpigot = new Spigot(1000);
|
||||
for(int i = 0; i < 1000; i++) {
|
||||
piSpigot->pump();
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue