bigInt powMod(bigInt base, bigInt exp, bigInt modul) { // возведение base в степень exp по модулю modul // используется алгоритм быстрого возведения в степень bigInt res = createFromInt(1); // сюда будет записан результат bigInt zero = createFromInt(0); bigInt two = createFromInt(2); bigInt b = copy(exp); bigInt a = copy(base); while (compare(b, zero) > 0) { if (odd(b)) { // res = (res * a) % modul; // tmp = res * base bigInt tmp = mul(res, a); // res = tmp % modul bigInt modRem; // сюда запишем остаток от деления bigInt tmp2 = dividing(tmp, modul, &modRem); free(tmp2.digits); free(tmp.digits); free(res.digits); res = modRem; } // a = (a*a) % modul bigInt tmp = mul(a, a); free(a.digits); bigInt modRem; // сюда запишем остаток от деления bigInt tmp2 = dividing(tmp, modul, &modRem); free(tmp2.digits); free(tmp.digits); a = modRem; // b = b /2 tmp = dividing(b, two, &modRem); free(b.digits); free(modRem.digits); b = tmp; } // очищаем память free(b.digits); free(zero.digits); free(two.digits); return res; }
long_class long_class::operator%(long_class &right) { long_class ost; long_class res; res.me = dividing(this->me, right.me, &ost.me); return ost; }
int main ( int argc, char * argv [ ] ) { int number ; printf ( "Give me a number : " ) ; scanf ( "%d", & number ) ; printf ( "F ( %d ) = %d\n", number, dividing ( number ) ) ; return 0 ; }
int saveTobinarFile(const char* filename, bigInt A) { // будем считать, что в бинарный файл необходимо записать число по основанию 256 // то есть необходимо перейти от BASE к 256 (256 - потому что максимальное значение байта - 255) // для этого надо находить остатки от деления на 256 // пока число не уменьшиться до 0 // возвращаем 0 в случае успешной записи // не 0 - в случае ошибки FILE* pfDestination = fopen(filename, "w+b"); if (!pfDestination) return 1; struct bigInt tmp = copy(A); // число, которое будем делить на 256 tmp.sign = 0; // не будем обращать внимания на знак bigInt zero = createFromInt(0); bigInt b256 = createFromInt(256); // пока число не станет равным 0 while (compare(tmp, zero) != 0) { bigInt ost; // куда будет записан остаток от деления на 256 // tmp = tmp / 256 bigInt tmp2 = dividing(tmp, b256, &ost); free(tmp.digits); tmp = tmp2; // теперь в ost очередной остаток от деления на 256 // запишем его в файл fwrite((char*)&ost.digits[0], sizeof(unsigned char), 1, pfDestination); free(ost.digits); } free(tmp.digits); free(b256.digits); free(zero.digits); fclose(pfDestination); return 0; }
int main(int argc, char* argv[]) { char *file1 = argv[1]; char *file2 = argv[3]; char *file3 = argv[4]; char *file4 = NULL; char op = argv[2][0]; int bin = 0; struct bNum n, m, md; if (argc == 6) { if (!strcmp(argv[5], "-b")) bin = 1; else file4 = argv[5]; } if (argc == 7) { bin = 1; file4 = argv[6]; } if (bin == 1) { n = ReadFromBFile(file1); m = ReadFromBFile(file2); if (file4 != NULL) md = ReadFromBFile(file4); } else { n = ReadFromTFile(file1); m = ReadFromTFile(file2); if (file4 != NULL) md = ReadFromTFile(file4); } struct bNum k; k.size = 0; k.sign = 0; k.nums = NULL; if (argv[2][0] == '+') k = Sum1(n, m); if (argv[2][0] == '-') { struct bNum minusB = mins(m); k = Sum1(n, minusB); free(minusB.nums); } if (argv[2][0] == '*') k = mul(n, m); if (argv[2][0] == '/') { struct bNum q; k = dividing(n, m, &q); free(q.nums); } if (argv[2][0] == '%') { struct bNum q = dividing(n, m, &k); free(q.nums); } if (file4 != NULL) { struct bNum tmp; struct bNum q = dividing(k, md, &tmp); free(q.nums); free(k.nums); k = tmp; } if (argv[2][0] == '^') { if (file4 == NULL) k = pPow(n, m); else k = powMod(n, m, md); } if (bin == 1) WriteToBFile(file3, k); else WriteToTFile(file3, k); free(n.nums); free(m.nums); free(k.nums); if (file4 != NULL) free(md.nums); return 0; }
int main() { printf("Start...."); start: printf("\n(input) "); //계산기 프로그램 시작 input(); error(); if(again == 1) { initialization(); goto start; } c_hoice(); if (chosen != 1){ //in1에 입력받은 문자가 1자리 대소문자가 아닌 경우 var_cal(); if (var_cal_switch == 1) { printf(" = error\n"); initialization(); goto start; } check_sign_in1(); // input1 +/- 부호 체크 check_sign_in3(); // input3 +/- 부호 체크 re_array_in1(); // 다항 연산 고려 순서 바꿔 저장 re_array_in3(); // 다항 연산 고려 순사 바꿔 저장 separate(); which_sign(); switch (in2[0]) { case '+' : { invert1(); convert1(); plus(); convert2(); invert2(); break; } case '-' : { invert1(); compare(); convert1(); minus(); convert2(); invert2(); break; } case '*' : { invert1(); invert1_mul_s(); multiply(); invert2(); invert2_mul_s(); break; } case '/' : { dividing(); break; } case '%' : { remain2(); break; } default: ; } printf(" = "); if(when_put_minus == 1) printf("-"); if (daeso == 1) printf("-"); comma(res_j); if (p != 0) {printf("."); comma(res_s);} } initialization(); goto start; return 0; }
int main() { printf("Start...."); start: printf("\n(input) "); //계산기 프로그램 시작 input(); c_hoice(); if (chosen != 1){ var_cal(); check_sign_in1(); check_sign_in3(); re_array_in1(); re_array_in3(); separate(); if(in2[0] == '-'){ if(minus_sign_count == 0) in2[0] = '-'; else if(minus_sign_count == 1){ if(if_minus_first == 1){ in2[0] = '+'; when_put_minus =1;} if(if_minus_last == 1) in2[0] = '+';} else{ in2[0] = '-';}} else if(in2[0] == '+'){ if(minus_sign_count == 0) in2[0] = '+'; else if(minus_sign_count == 1){ if(if_minus_first == 1) in2[0] = '-'; if(if_minus_last == 1) in2[0] = '-';} else{ in2[0] = '+'; when_put_minus=1;}} else if(in2[0] == '*'){ if(minus_sign_count == 0 || minus_sign_count == 2) in2[0] = '*'; else if(minus_sign_count == 1){ in2[0] = '*'; when_put_minus=1;}} else if(in2[0] == '/'){ if(minus_sign_count == 0 || minus_sign_count == 2) in2[0] = '/'; else if(minus_sign_count == 1){ in2[0] = '/'; when_put_minus=1;}} else if(in2[0] == '%'){ if(minus_sign_count == 0 || minus_sign_count == 2){ if(if_minus_first == 1){ in2[0] = '%'; when_put_minus = 1;} else in2[0] = '%';} else if(minus_sign_count == 1){ if(if_minus_first == 1){ in2[0] = '%'; when_put_minus = 1;} else in2[0] = '%';}} switch (in2[0]) { case '+' : { invert1(); convert1(); plus(); convert2(); invert2(); break; } case '-' : { invert1(); compare(); convert1(); minus(); convert2(); invert2(); break; } case '*' : { invert1(); invert1_mul_s(); multiply(); invert2(); invert2_mul_s(); break; } case '/' : {printf("지호 "); dividing(); convert2(); break; } case '%' : { invert1(); compare(); convert1(); remain(); convert2(); invert2(); break; } default: ; } printf(" = "); if(when_put_minus == 1) printf("-"); // if(when_remove_minus == 1) //여기서 - 부호 하나를 배열에서 빼주는 명령어 쓸 수 없을까? if (daeso == 1) printf("-"); comma(res_j); if (p != 0) {printf("."); comma(res_s);} } initialization(); goto start; return 0; }