从头开始学算法:考研机试题练习(C/C++)–数学问题

从头开始学算法:考研机试题练习(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值