从头开始学算法:考研机试题练习(C/C++)–数学问题
最近重学C语言,刷的是胡凡写的《算法笔记》,这本书的题主要是面向考研机试和一般算法考试的,零基础入门,还不错,在此记录学习过程。
本文主要记录一些与数学问题相关的简单算法。
#include <stdio.h>
#include <algorithm>
#include "simpleAlgorithm.h"
using namespace std;
int array_to_int(int a[])
{
int res=0;
for (int i = 0; i < 4; i++) {
res = res * 10 + a[i];
}
return res;
}
void int_to_array(int a, int res[])
{
for (int i = 3; i >= 0; i--)
{
res[i] = a % 10;
a /= 10;
}
}
bool cmp_big(int a, int b)
{
return a > b;
}
/*数字黑洞*/
void number_hole()
{
int a[4],min, max, res,temp;
scanf("%d", &temp);
int_to_array(temp, a);
sort(a, a + 4);//升序
min = array_to_int(a);
sort(a, a + 4, cmp_big);//降序
max = array_to_int(a);
res = max - min;
if ( res== 0) {
printf("%04d - %04d = 0000", max, min);
return;
}
while (res != 6174) {
printf("%04d - %04d = %04d\n", max, min, res);
int_to_array(res, a);
sort(a, a + 4);//升序
min = array_to_int(a);
sort(a, a + 4, cmp_big);//降序
max = array_to_int(a);
res = max - min;
}
printf("%04d - %04d = %04d\n", max, min, res);
}
/*最大公约数的递归*/
void recusion_gcd(int num1, int num2)
{
if (num2 == 0) {
printf("%d", num1);
}
else {
num1 = num1%num2;
recusion_gcd(num2, num1);
}
}
/*最大公约数*/
void gcd_fun()
{
int a, b;
scanf("%d %d", &a, &b);
if (a == b)
printf("%d", a);
else if (a > b) {
recusion_gcd(a, b);
}
else {
recusion_gcd(b, a);
}
}
/*数素数*/
void count_prime()
{
int a[10000], m, n, prime_num=1, prime_index,record_m=-1;
scanf("%d %d", &m, &n);
a[0] = 2;
for (int i = 3; prime_num <= n; i++) {
for (prime_index = 0; a[prime_index] <= int(sqrt(i));prime_index++) {
if (i%a[prime_index] == 0)
break;
}
if (a[prime_index] > int(sqrt(i))) {
a[prime_num++] = i;//把该素数加入
}
}
int count=0;
for (int j = m-1; j < prime_num-1; j++) {
if (count % 10 == 0)
printf("%d", a[j]);
else
printf(" %d", a[j]);
if (count % 10 == 9)
printf("\n");
count++;
}
}
int get_prime(int num, int a[])
{
int prime_num = 1, prime_index;
a[0] = 2;
for (int i = 3; i <= num; i++) {
for (prime_index = 0; a[prime_index] <= int(sqrt(i)); prime_index++) {
if (i%a[prime_index] == 0)
break;
}
if (a[prime_index] > int(sqrt(i))) {
a[prime_num++] = i;//把该素数加入
}
}
return prime_num;
}
//求num的阶乘中facter的个数
int cal(int num, int factor)
{
int res=0,temp, sort=factor;
temp = num / sort;
while (temp) {
res += temp;
sort *= factor;
temp = num / sort;
}
return res;
}
//求C_n^m%p
void combinatorial_num()
{
int n, m, p, prime[10000], prime_num;
long long result=1;
scanf("%d %d %d", &n, &m, &p);
prime_num = get_prime(n, prime);
for (int i = 0; i < prime_num; i++) {
int c;//含质因数prime[i]的个数
c = cal(n, prime[i]) - cal(m, prime[i]) - cal(n - m, prime[i]);
result = result * recusion_power(prime[i], c) % p;
}
printf("%lld", result);
}
int main()
{
//number_hole();
//gcd_fun();
//count_prime();
combinatorial_num();
return 0;
}