// load automata for scanning valid identifiers void Scanner::load_id_machine() { // create the id scan automata auto id_machine = FSMachinePtr( new FiniteMachineContainer(get_token_info(TokType::MP_ID).first, true)); // detects ids without two underscores id_machine->add_state("0", true, false); id_machine->add_state("1", false, true); id_machine->add_state("2", false, true); id_machine->add_state("3", false, false); id_machine->add_state("4", false, false); // add transitions id_machine->add_alphabet("0", "1"); id_machine->add_alphabet("1", "1"); id_machine->add_digits("1", "1"); id_machine->add_transition("1", '_', "4"); id_machine->add_alphabet("4", "1"); id_machine->add_digits("4", "1"); // other part id_machine->add_transition("0", '_', "3"); id_machine->add_alphabet("3", "2"); id_machine->add_digits("3", "2"); id_machine->add_alphabet("2", "2"); id_machine->add_digits("2", "2"); id_machine->add_transition("2", '_', "3"); // set priority id_machine->set_priority(2); // add to finite machines this->fsmachines->push_back(FSMachinePtr(id_machine)); }
void Scanner::load_strand_machines(unsigned int within) { // comments and strings, take that! // add nested strings and comments feature using within variable auto comment_machine = FSMachinePtr( new FiniteMachineContainer(get_token_info(TokType::MP_COMMENT).first, true)); // add states comment_machine->add_state("0", true, false); comment_machine->add_state("1", false, false); comment_machine->add_state("2", false, true); // for state 1 comment_machine->add_alphabet("1", "1"); comment_machine->add_symbols("1", "1"); comment_machine->add_digits("1", "1"); comment_machine->add_transition("1", ' ', "1"); comment_machine->add_transition("1", '\n', "1"); comment_machine->add_transition("1", '\t', "1"); comment_machine->add_transition("1", '\v', "1"); comment_machine->add_transition("1", '\r', "1"); comment_machine->add_transition("1", '\f', "1"); comment_machine->remove_transition("1", '{'); comment_machine->remove_transition("1", '}'); comment_machine->add_transition("0", '{', "1"); comment_machine->add_transition("1", '}', "2"); // new machine auto string_machine = FSMachinePtr( new FiniteMachineContainer(get_token_info(TokType::MP_STRING_LITERAL).first, true)); // add states string_machine->add_state("0", true, false); string_machine->add_state("1", false, false); string_machine->add_state("2", false, true); // add transitions string_machine->add_transition("0", '\'', "1"); string_machine->add_alphabet("1", "1"); string_machine->add_symbols("1", "1"); string_machine->add_digits("1", "1"); string_machine->add_transition("1", ' ', "1"); string_machine->remove_transition("1", '\''); string_machine->remove_transition("1", '\''); string_machine->add_transition("1", '\'', "2"); // set machine priority comment_machine->set_priority(1); string_machine->set_priority(1); // add the machines to our FSMachines list this->fsmachines->push_back(comment_machine); this->fsmachines->push_back(string_machine); }
int main(){ std::set<unsigned long> products; unsigned long result = 0; //number of digits total must be 9 //each part of the identity has at least 1 and at most 7 digits //multiplicand has at most 7 digits for(unsigned long multiplicand = 1; multiplicand < 10000000; ++multiplicand){ int multiplicand_digits = get_num_digits(multiplicand); //digits of multiplier depends on digits of multiplicand and product (which is not known yet) for(unsigned long multiplier = 1; multiplier < static_cast<unsigned long>(pow(10,8-multiplicand_digits)); ++multiplier){ int multiplier_digits = get_num_digits(multiplier); int num_digits = multiplicand_digits + multiplier_digits + (int) (log10(multiplicand) + log10(multiplier) + 1); if( num_digits < 9 ){ continue; } if( num_digits > 9 ){ break; } unsigned long product = multiplicand * multiplier; std::array<bool, 10> digit_table; digit_table.fill(false); //add digits to digit table. if a digit was already added, continue to next loop if(!add_digits(multiplicand, digit_table)){ continue; } if(!add_digits(multiplier, digit_table)){ continue; } if(!add_digits(product, digit_table)){ continue; } //at this point, there are 9 digits in the identity and each one was added //also there was no zero added, so there must be all digits in the sum if(products.find(product) == products.end()){ result += product; products.insert(product); } } } std::cout << result << std::endl; return 0; }
void Scanner::load_num_machines() { // create floating point automata for scanning numeric literals auto float_machine = FSMachinePtr( new FiniteMachineContainer(get_token_info(TokType::MP_FLOAT_LITERAL).first, true)); // add states to this DFA, first and final float_machine->add_state("0", true, false); float_machine->add_state("1", false, false); float_machine->add_state("2", false, true); float_machine->add_state("3", false, false); float_machine->add_state("4", false, false); float_machine->add_state("5", false, true); float_machine->add_digits("0", "1"); float_machine->add_digits("1", "1"); float_machine->add_transition("1", '.', "2"); float_machine->add_digits("2", "2"); float_machine->add_transition("2", 'e', "3"); float_machine->add_transition("2", 'E', "3"); float_machine->add_transition("3", '+', "4"); float_machine->add_transition("3", '-', "4"); float_machine->add_digits("3", "5"); float_machine->add_digits("4", "5"); float_machine->add_digits("5", "5"); // create integer automata auto integer_machine = FSMachinePtr( new FiniteMachineContainer(get_token_info(TokType::MP_INT_LITERAL).first, true)); // add states to this DFA integer_machine->add_state("0", true, false); integer_machine->add_state("1", false, true); integer_machine->add_digits("0", "1"); integer_machine->add_digits("1", "1"); // reset both float_machine->reset(); integer_machine->reset(); // set machine priorities float_machine->set_priority(1); integer_machine->set_priority(1); // add both to the finite machines list this->fsmachines->push_back(FSMachinePtr(float_machine)); this->fsmachines->push_back(FSMachinePtr(integer_machine)); }
int add_digits(int x) { static int sum = 0; if (x == 0) { return 0; } sum = x%10 + add_digits(x / 10); return sum; }
void BigInt::add_vector(std::vector<int> &a, std::vector<int> &b) { assert(a.size() == b.size()); int remainder = 0; for (int i = 0; i < a.size(); ++i) { a[i] = add_digits(a[i], b[i], remainder); } if (remainder != 0) a.push_back(remainder); }
int main() { // This function accepts a number and calculates the sum of its digits int n, result; printf("Enter a number\n"); scanf_s("%d", &n); result = add_digits(n); printf("The sum of %d is %d\n", n, result); return 0; }