第六章 数学问题代码

代码6.1
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

void Convert(int number) {
    vector<int> answer;
    if (number == 0){
        answer.push_back(0);
    }else{
    while (number != 0){
        answer.push_back(number % 2);
        number /= 2;
        }
    }
    for(int i = answer.size() - 1; i >= 0; i--){
        printf("%d",answer[i]);
    }
    printf("\n");
}

int main(){
    int number;
    while(scanf("%d",&number) != EOF){
        Convert(number);
    }
}

8.2 八进制(此代码只适合0-9进制转二进制)
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

void ConvertT2N(int number,int n){
    vector<int> answer;
    if(number == 0){
        answer.push_back(0);
    }else {
        while(number != 0){
            answer.push_back(number % n);
            number /= n;
        }
    }
    for(int i = answer.size() - 1; i >= 0; --i){
        printf("%d",answer[i]);
    }
    printf("\n");
}

int main(){
    int number;
    while (scanf("%d",&number) != EOF){
            ConvertT2N(number,8);
        }
}

 

3.适合16进制转二进制
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

char Int2Char(int target){
    if(target < 10){
        return target + '0';
    }else {
        return target - 10 + 'A';
    }
}

void ConvertT2N(int number,int n){
    vector<char> answer;
    if(number == 0){
        answer.push_back('0');
    }else {
        while(number != 0){
            answer.push_back(Int2Char(number % n));
            number /= n;
        }
    }
    for(int i = answer.size() - 1; i >= 0; --i){
        printf("%c",answer[i]);
    }
    printf("\n");
}

int main(){
    int number;
    while (scanf("%d",&number) != EOF){
            ConvertT2N(number,16);
        }
    return 0;
}

4.M-N
#include <iostream>
#include <cstdio>

using namespace std;

int Char2Int(char target){
    if('0' <= target && target <= '9'){
        return target - '0';
    }else {
        return target - 'A' + 10;
    }
}

void ConvertM2T(string str, int m){
    int number = 0;
    for(int i= 0; i < str.size(); i++){
        number *= m;
        number += Char2Int(str[i]);
    }
    printf("%d\n",number);
}

int main(){
    string str;
    while(cin >> str){
        str = str.substr(2);
        ConvertM2T(str,16);
    }
    return 0;
}

5.例题6.4 进制转换2
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

char Int2Char(int target){
    if(target < 10){
        return target + '0';
    }else {
        return target - 10 + 'a';
    }
}

int Char2Int(char target){
    if('0' <= target && target <= '9'){
        return target - '0';
    }else {
        return target - 'A' + 10;
    }
}

long long ConvertM2T(string str, int m){
    long long number = 0;
    for(int i= 0; i < str.size(); i++){
        number *= m;
        number += Char2Int(str[i]);
    }
    return number;
}

void ConvertT2N(long long number,int n){
    vector<int> answer;
    if(number == 0){
        answer.push_back(0);
    }else {
        while(number != 0){
            answer.push_back(number % n);
            number /= n;
        }
    }
    for(int i = answer.size() - 1; i >= 0; --i){
        printf("%d",answer[i]);
    }
    printf("\n");
}

int main(){
    int m, n;
    while(scanf("%d%d", &m, &n) != EOF){
        string str;
        cin >> str;
        long long number = ConvertM2T(str, m);
        ConvertT2N(number, n);
    }
}

1.例题6.5  最大公约数
#include <iostream>
#include <cstdio>

using namespace std;

int GCD(int a,int b){
    if(b == 0){
        return a;
    }else {
        return GCD(b, a % b);
    }
}

int main(){
    int a,b;
    while (scanf("%d%d", &a, &b) != EOF){
        printf("%d\n",GCD(a,b));
    }
    return 0;
}

2.代码6.6
#include <iostream>
#include <cstdio>

using namespace std;

int GCD(int a,int b){
    if(b == 0){
        return a;
    }else {
        return GCD(b, a % b);
    }
}

int main(){
    int a,b;
    while (scanf("%d%d", &a, &b) != EOF){
        printf("%d\n",a*b / GCD(a,b));
    }
    return 0;
}

例题6.7
#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

bool Judge(int n) {
    if(n < 2){
        return false;
    }
    int bound = sqrt(n);
    for(int i = 2; i <= bound; ++i){
        if(n % i == 0){
            return false;
        }
    }
    return true;
}

int main(){
    int n;
    while(scanf("%d",&n) != EOF){
        if(Judge(n)){
            printf("yes\n");
        }else{
            printf("no\n");
        }
    }
    return 0;
}

习题6.6  输出第k个素数
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

const int MAXN = 1e5 + 10;

vector<int> prime;
bool isPrime[MAXN];

void Initial(){
    for (int i = 0; i < MAXN; ++i){
        isPrime[i] = true;
    }
    isPrime[0] = false;
    isPrime[1] = false;
    for(int i = 2; i < MAXN; ++i){
        if(!isPrime[i]){
            continue;
        }
        prime.push_back(i);
        if(i > MAXN / i){
            continue;
        }
        for(int j = i * i; j < MAXN; j += i){
            isPrime[j] = false;
        }
    }
}

int main() {
    Initial();
    int k;
    while (scanf("%d",&k) != EOF){
        printf("%d\n",prime[k-1]);
    }
    return 0;
}

例题6.9质因数的个数
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

const int MAXN = 4e4;

vector<int> prime;
bool isPrime[MAXN];

void Initial(){
    for (int i = 0; i < MAXN; ++i){
        isPrime[i] = true;
    }
    isPrime[0] = false;
    isPrime[1] = false;
    for(int i = 2; i < MAXN; ++i){
        if(!isPrime[i]){
            continue;
        }
        prime.push_back(i);
        if(i > MAXN / i){
            continue;
        }
        for(int j = i * i; j < MAXN; j += i){
            isPrime[j] = false;
        }
    }
}

int NumberOfPrimeFactor(int number){
    int answer = 0;
    for(int i = 0; i < prime.size(); i++){
        int factor = prime[i];
        if(number < factor){
            break;
        }
        int exponent = 0;
        while(number % factor == 0){
            exponent++;
            number /= factor;
        }
        answer += exponent;
    }
    if(number > 1){
        answer += 1;
    }
    return answer;
}


int main() {
    Initial();
    int number;
    while (scanf("%d",&number) != EOF){
        printf("%d\n",NumberOfPrimeFactor(number));
    }
    return 0;
}

习题6.7约数的个数
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

const int MAXN = 4e4;

vector<int> prime;
bool isPrime[MAXN];

void Initial(){
    for (int i = 0; i < MAXN; ++i){
        isPrime[i] = true;
    }
    isPrime[0] = false;
    isPrime[1] = false;
    for(int i = 2; i < MAXN; ++i){
        if(!isPrime[i]){
            continue;
        }
        prime.push_back(i);
        if(i > MAXN / i){
            continue;
        }
        for(int j = i * i; j < MAXN; j += i){
            isPrime[j] = false;
        }
    }
}

int NumberOfFactors(int number){
    int answer = 1;
    for(int i = 0; i < prime.size(); i++){
        int factor = prime[i];
        if(number < factor){
            break;
        }
        int exponent = 0;
        while(number % factor == 0){
            exponent++;
            number /= factor;
        }
        answer *= exponent + 1;
    }
    if(number > 1){
        answer *= 2;
    }
    return answer;
}


int main() {
    Initial();
    int n;
    while (scanf("%d",&n) != EOF){
        if(n == 0){
            break;
        }
        for(int i = 0; i < n; i++){
        int number;
        scanf("%d",&number);
        printf("%d\n",NumberOfFactors(number));
        }
    }
    return 0;
}


1.快速幂模板
#include <iostream>
#include <cstdio>

using namespace std;

int QuickPower(int x,int n) {
    int answer = 1;
    while(n != 0){
        if(n % 2 == 1){
            answer *= x;
        }
        n / 2; //n >> 1;
        x *= x;
    }
    return answer;
}

2.例题6.10人见人爱A*B(模板的变形)
#include <iostream>
#include <cstdio>

using namespace std;

int QuickPower(int x,int n) {
    int mod = 1000;
    int answer = 1;
    while(n != 0){
        if(n % 2 == 1){
            answer *= x;
            answer %= mod;
        }
        n /= 2; //n >> 1;
        x *= x;
        x %= mod;
    }
    return answer;
}

int main(){
    int a, b;
    while(scanf("%d%d",&a,&b) != EOF){
        if(a == 0 && b == 0){
            break;
        }
        printf("%d\n",QuickPower(a,b));
    }
    return 0;
}
1.矩阵定义
#include <iostream>
#include <cstdio>

using namespace std;

const int MAXN = 100;

//矩阵定义
struct Matrix {
    int row, col;
    int maxtix[MAXN][MAXN];
    Matrix(){}
    Matrix(int r,int c): row(r), col(c){}
};

int main(){
    
    return 0;
}
2.矩阵加法
#include <iostream>
#include <cstdio>

using namespace std;

const int MAXN = 100;

//矩阵定义
struct Matrix {
    int row, col;
    int maxtix[MAXN][MAXN];
    Matrix(){}
    Matrix(int r,int c): row(r), col(c){}
};
//矩阵加法
Matrix Add(Maxtrix x,Maxtrix y){
    Matrix answer = Maxtrix(x.row,x.col);
    for (int i = 0; i < answer.row; ++i){
        for(int j = 0; j < answer.col; ++j){
            answer.matrix[i][j] = x.matrix[i][j] + y.matrix[i][j];
        }
    }
}

int main(){
    
    return 0;
}
3.矩阵相乘
#include <iostream>
#include <cstdio>

using namespace std;

const int MAXN = 100;

//矩阵定义
struct Matrix {
    int row, col;
    int maxtix[MAXN][MAXN];
    Matrix(){}
    Matrix(int r,int c): row(r), col(c){}
};
//矩阵加法
Matrix Add(Matrix x,Matrix y){
    Matrix answer = Matrix(x.row,x.col);
    for (int i = 0; i < answer.row; ++i){
        for(int j = 0; j < answer.col; ++j){
            answer.matrix[i][j] = x.matrix[i][j] + y.matrix[i][j];
        }
    }
}
//矩阵相乘
Matrix Multiply(Matrix x,Matrix y){
    Matrix answer = Matrix(x.row, y.col);
    for(int i = 0; i < answer.row; ++i){
        for(int j = 0; j < answer.col; ++j){
            answer.matrix[i][j] = 0;
            for(int k = 0; k < x.col; ++k){
               answer.matrix[i][j] = x.maxtix[i][k] + y.maxtix[k][j];
            }
        }
    }
    return answer;
}

int main(){
    
    return 0;
}

 

4.例题6.11 计算两个矩阵的乘积
#include <iostream>
#include <cstdio>

using namespace std;

const int MAXN = 100;

//矩阵定义
struct Matrix {
    int row, col;
    int matrix[MAXN][MAXN];
    Matrix(){}
    Matrix(int r,int c): row(r), col(c){}
};
//矩阵加法
Matrix Add(Matrix x,Matrix y){
    Matrix answer = Matrix(x.row,x.col);
    for (int i = 0; i < answer.row; ++i){
        for(int j = 0; j < answer.col; ++j){
            answer.matrix[i][j] = x.matrix[i][j] + y.matrix[i][j];
        }
    }
    return answer;
}
//矩阵相乘
Matrix Multiply(Matrix x,Matrix y){
    Matrix answer = Matrix(x.row, y.col);
    for(int i = 0; i < answer.row; ++i){
        for(int j = 0; j < answer.col; ++j){
            answer.matrix[i][j] = 0;
            for(int k = 0; k < x.col; ++k){
               answer.matrix[i][j] = x.matrix[i][k] * y.matrix[k][j];
            }
        }
    }
    return answer;
}

void InputMatrix(Matrix& x){
    for(int i = 0; i < x.row; ++i){
        for(int j = 0; j < x.col; ++j){
            scanf("%d",&x.matrix[i][j]);
        }
    }
    return ;
}

void OutputMatrix(Matrix x){
    for(int i = 0; i < x.row; ++i){
        for(int j = 0; j < x.col; ++j){
            printf("%d ",x.matrix[i][j]);
        }
          printf("\n");
    }
}

int main(){
    Matrix x( 2, 3);
    Matrix y( 3, 2);
    InputMatrix(x);
    OutputMatrix(y);
    Matrix answer = Multiply(x,y);
    OutputMatrix(answer);
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值