首页 > 编程语言 > 详细

【MOOC课程学习记录】程序设计与算法(一)C语言程序设计

时间:2019-08-27 10:18:12      阅读:64      评论:0      收藏:0      [点我收藏+]

课程结课了,把做的习题都记录一下,告诉自己多少学了点东西,也能给自己一点鼓励。

ps:题目都在cxsjsxmooc.openjudge.cn上能看到,参考答案在差不多结课的时候也会在mooc上放出来。

程序设计与算法(一)C语言程序设计 第一周习题(2019夏季)

001:输出第二个整数

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    int a, b, c;
    cin >> a >> b >> c;
    cout << b;
    return 0;
}

002:字符菱形

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    char c;
    scanf("%c", &c);
    printf("  %c\n", c);
    printf(" %c%c%c\n", c, c, c);
    printf("%c%c%c%c%c\n", c, c, c, c, c);
    printf(" %c%c%c\n", c, c, c);
    printf("  %c\n", c);
    return 0;
}

003:打印ASCII码

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    char c;
    scanf("%c", &c);
    printf("%d\n", c);
    return 0;
}

004:打印字符

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    int c;
    scanf("%d", &c);
    printf("%c\n", c);
    return 0;
}

005:整型数据类型存储空间大小

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    int a;
    short b;
    printf("%lu ", sizeof(a));
    printf("%lu", sizeof(b));
    return 0;
}

006:浮点型数据类型存储空间大小

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    float a;
    double b;
    printf("%lu ", sizeof(a));
    printf("%lu", sizeof(b));
    return 0;
}

程序设计与算法(一)C语言程序设计 第二周习题(2019夏季)

001:对齐输出

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    printf("%8d %8d %8d", a, b, c);
    return 0;
}

002:输出保留12位小数的浮点数

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    double a;
    scanf("%lf", &a);
    printf("%.12lf", a);
    return 0;
}

003:空格分隔输出

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    char a;
    int b;
    float c;
    double d;
    scanf("%c", &a);
    scanf("%d", &b);
    scanf("%f", &c);
    scanf("%lf", &d);
    printf("%c ", a);
    printf("%d ", b);
    printf("%.6f ", c);
    printf("%.6lf", d);
    return 0;
}

004:计算球的体积

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    double d;
    scanf("%lf", &d);
    printf("%.2lf", 4.0/3*3.14*d*d*d);
    return 0;
}

005:大象喝水

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    int h, r;
    float c;
    scanf("%d %d", &h, &r);
    c = 3.14159*r*r*h;
    printf("%d", int(20000/c+1));
    return 0;
}

程序设计与算法(一)C语言程序设计 第三周习题(2019夏季)

001:奇偶数判断

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    int a;
    cin >> a;
    if (a % 2){
        cout << "odd";
    }else{
        cout << "even";
    }
    return 0;
}

002:求一元二次方程的根

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

#define EPS 1e-6

int main(){
    double a, b, c;
    scanf("%lf %lf %lf", &a, &b, &c);
    double x1, x2, tmp;
    if (b*b-4*a*c > -EPS && b*b-4*a*c < EPS){
        x1 = x2 = -b/(2*a);
        printf("x1=x2=%.5lf", x1);
    }else if (b*b-4*a*c >= EPS){
        x1 = ((-b)+sqrt(b*b-4*a*c))/(2*a);
        x2 = ((-b)-sqrt(b*b-4*a*c))/(2*a);
        if (x1 < x2){
            tmp = x1;
            x1 = x2;
            x2 = tmp;
        }
        printf("x1=%.5lf;x2=%.5lf", x1, x2);
    }else{
        // 此处x1用来储存实部系数,x2用来储存虚部系数
        x1 = -b/(2*a);
        x2 = sqrt(4*a*c-b*b)/(2*a);
        if (x1 < EPS && x1 > -EPS){
            x1 = 0;
        }
        printf("x1=%.5lf+%.5lfi;x2=%.5lf-%.5lfi", x1, x2, x1, x2);
    }
    return 0;
}

003:点和正方形的关系

#include <iostream>
#include <cstdio>
using namespace std;


int main(){
    int x, y;
    scanf("%d %d", &x, &y);
    if (x <= 1 && x >= -1 && y <= 1 && y >= -1){
        printf("yes");
    }else{
        printf("no");
    }
    return 0;
}

004:苹果和虫子2

#include <iostream>
#include <cstdio>
using namespace std;


int main(){
    int n, x, y;
    cin >> n >> x >> y;
    int a;
    if (y%x){
        a = n-y/x-1;
    }else{
        a = n-y/x;
    }
    if (a < 0){
        a = 0;
    }
    cout << a;
    return 0;
}

005:简单计算器

#include <iostream>
#include <cstdio>
using namespace std;


int main(){
    int opd1, opd2;
    char opt;
    scanf("%d %d %c", &opd1, &opd2, &opt);
    int res;
    switch (opt){
    case '+':
        res = opd1+opd2;
        printf("%d", res);
        break;
    case '-':
        res = opd1-opd2;
        printf("%d", res);
        break;
    case '*':
        res = opd1*opd2;
        printf("%d", res);
        break;
    case '/':
        if (!opd2){
            printf("Divided by zero!");
        }else{
            res = opd1/opd2;
            printf("%d", res);
        }
        break;
    default:
        printf("Invalid operator!");
        break;
    }
    return 0;
}

006:求整数的和与均值

#include <iostream>
#include <cstdio>
using namespace std;


int main(){
    int n, sum;
    double ave;
    sum = 0;
    cin >> n;
    int i, tmp;
    for (i = 0; i < n; i++){
        cin >> tmp;
        sum += tmp;
    }
    ave = 1.0*sum/n;
    printf("%d %.5f", sum, ave);
    return 0;
}

007:整数序列的元素最大跨度值

#include <iostream>
#include <cstdio>
using namespace std;


int main(){
    int n;
    cin >> n;
    int max, min;
    max = 0;
    min = 1000;
    int i, tmp;
    for (i = 0; i < n; i++){
        cin >> tmp;
        if (tmp > max){
            max = tmp;
        }
        if (tmp < min){
            min = tmp;
        }
    }
    cout << max - min;
    return 0;
}

008:奥运奖牌计数

#include <iostream>
#include <cstdio>
using namespace std;


int main(){
    int n;
    scanf("%d", &n);
    int goldMedal, silverMedal, bronzeMedal;
    goldMedal = silverMedal = bronzeMedal = 0;
    int i, a, b, c;
    for (i = 0; i < n; i++){
        scanf("%d %d %d", &a, &b, &c);
        goldMedal += a;
        silverMedal += b;
        bronzeMedal += c;
    }
    int totalMedal;
    totalMedal = goldMedal+silverMedal+bronzeMedal;
    printf("%d %d %d %d", goldMedal, silverMedal, bronzeMedal, totalMedal);
    return 0;
}

009:乘方计算

#include <iostream>
#include <cstdio>
using namespace std;


int main(){
    int a, n, res;
    res = 1;
    scanf("%d %d", &a, &n);
    while (n > 0){
        res *= a;
        n--;
    }
    printf("%d", res);
    return 0;
}

010:鸡尾酒疗法

#include <iostream>
#include <cstdio>
using namespace std;


int main(){
    int n;
    cin >> n;
    double a[n];
    int i, total, effective;
    for (i = 0; i < n; i++){
        cin >> total >> effective;
        a[i] = 1.0*effective/total;
    }
    for (i = 1; i < n; i++){
        if (a[i]-a[0] > 0.05){
            cout << "better\n";
        }else if (a[i]-a[0] < -0.05){
            cout << "worse\n";
        }else{
            cout << "same\n";
        }
    }
    return 0;
}

程序设计与算法(一)C语言程序设计 第四周习题(2019夏季)

001:角谷猜想

#include <iostream>
#include <cstdio>
using namespace std;


int main(){
    long long n;
    scanf("%lld", &n);
    while (n > 1){
        if (n%2){
            printf("%lld*3+1=%lld\n", n, 3*n+1);
            n = 3*n+1;
        }else{
            printf("%lld/2=%lld\n", n, n/2);
            n /= 2;
        }
    }
    printf("End");
    return 0;
}

002:正常血压

#include <iostream>
#include <cstdio>
using namespace std;


int main(){
    int n;
    cin >> n;
    int max, tmp, systolicPressure, diastolicPressure;
    max = tmp = 0;
    int i;
    for (i = 0; i < n; i++){
        cin >> systolicPressure >> diastolicPressure;
        if (systolicPressure <= 140 && systolicPressure >= 90
        && diastolicPressure <= 90 && diastolicPressure >= 60){
            tmp++;
            if (tmp > max){
                max = tmp;
            }
        }else{
            tmp = 0;
        }
    }
    cout << max;
    return 0;
}

003:数字反转

#include <iostream>
#include <cstdio>
using namespace std;

int main(int argc, char const *argv[])
{
    int n;
    scanf("%d", &n);
    int sign = 1;
    if (n < 0){
        sign = -1;
        n = -n;
    }
    int rev = 0;
    while (n > 0){
        rev = rev*10 + n%10;
        n /= 10;
    }
    rev = sign*rev;
    printf("%d", rev);
    return 0;
}

004:求特殊自然数

#include <iostream>
#include <cstdio>
using namespace std;

int main(int argc, char const *argv[])
{
    int n10, n7, n9;
    int a[3], b[3], tmpA, tmpB, i, j;
    for (n10 = 81; n10 < 343; n10++){
        tmpA = tmpB = n10;
        i = j = 2;
        while (tmpA > 0){
            a[i] = tmpA%7;
            tmpA /= 7;
            i--;
        }
        while (tmpB > 0){
            b[j] = tmpB%9;
            tmpB /= 9;
            j--;
        }
        if (a[0] == b[2] && a[1] == b[1] && a[2] == b[0]){
            break;
        }
    }
    cout << n10 << "\n" << a[2]+a[1]*10+a[0]*100 << "\n" << b[2]+b[1]*10+b[0]*100;
    return 0;
}

005:雇佣兵

#include <iostream>
#include <cstdio>
using namespace std;

#define MAXSIZE 10

int main(int argc, char const *argv[])
{
    int M, N, X;
    cin >> M >> N >> X;
    while (N*X >= M){
        X -= M/N+1;
        N += M/N;
    }
    printf("%d", N);
    return 0;
}

006:数字统计

#include <iostream>
#include <cstdio>
using namespace std;

int main(int argc, char const *argv[])
{
    int a, b;
    cin >> a >> b;
    int i, tmp, counter;
    counter = 0;
    for (i = a; i <= b; i++){
        int t = i;
        while (t>0){
            tmp = t%10;
            t /= 10;
            if (tmp == 2){
                counter++;
            }
        }
    }
    cout << counter;
    return 0;
}

程序设计与算法(一)C语言程序设计 第五周习题(2019夏季)

001:与指定数字相同的数的个数

#include <iostream>
#include <cstdio>
using namespace std;
    
int main(int argc, char const *argv[])
{
    int n;
    scanf("%d", &n);
    int a[n], i;
    for (i = 0; i < n; i++){
        scanf("%d", &a[i]);
    }
    int specifiedNumber;
    scanf("%d", &specifiedNumber);
    int counter = 0;
    for (i = 0; i < n; i++){
        if (a[i] == specifiedNumber){
            counter++;
        }
    }
    printf("%d", counter);
    return 0;
}

002:陶陶摘苹果

#include <iostream>
#include <cstdio>
using namespace std;

#define MAXSIZE 10

int main(int argc, char const *argv[])
{
    int height[MAXSIZE];
    int i;
    int counter = 0;
    for (i = 0; i < MAXSIZE; i++){
        cin >> height[i];
    }
    int taotao;
    int bench = 30;
    cin >> taotao;
    for (i = 0; i < 10; i++){
        if (height[i] <= taotao + bench){
            counter++;
        }
    }
    cout << counter;
    return 0;
}

003:年龄与疾病

#include <iostream>
#include <cstdio>
using namespace std;

#define MAXSIZE 10

int main(int argc, char const *argv[])
{
    int n;
    scanf("%d", &n);
    int a[n], i, counter18, counter35, counter60, counterOther;
    counter18 = counter35 = counter60 = counterOther = 0;
    for (i = 0; i < n; i++){
        scanf("%d", &a[i]);
        if (a[i] <=18 ){
            counter18++;
        }else if (a[i] <= 35){
            counter35++;
        }else if (a[i] <= 60){
            counter60++;
        }else{
            counterOther++;
        }
    }
    printf("%.2f%%\n", 100.0*counter18/n);
    printf("%.2f%%\n", 100.0*counter35/n);
    printf("%.2f%%\n", 100.0*counter60/n);
    printf("%.2f%%\n", 100.0*counterOther/n);
    return 0;
}

004:校门外的树

#include <iostream>
#include <cstdio>
using namespace std;

int main(int argc, char const *argv[])
{
    int L, M;
    scanf("%d %d", &L, &M);
    int a[L+1], tmpA, tmpB, i;
    for (i = 0; i < L+1; a[i++] = 1)
        ;
    for (i = 0; i < M; i++){
        scanf("%d %d", &tmpA, &tmpB);
        int j;
        for (j = tmpA; j <= tmpB; a[j++] = 0)
            ;
    }
    int counter = 0;
    for (i = 0; i < L+1; i++){
        if (a[i] == 1){
            counter++;
        }
    }
    printf("%d", counter);
    return 0;
}

005:计算鞍点

#include <iostream>
#include <cstdio>
using namespace std;

#define MAXLINE 5
#define MAXROW 5

int main(int argc, char const *argv[])
{
    int a[MAXLINE][MAXROW], i, j, lmax, max[MAXLINE];
    for (i = 0; i < MAXLINE; i++){
        cin >> a[i][0];
        lmax = a[i][0];
        max[i] = 0;
        for (j = 1; j < MAXROW; j++){
            cin >> a[i][j];
            if (a[i][j] > lmax){
                lmax = a[i][j];
                max[i] = j;
            }
        }
    }
    int found = 1;
    for (i = 0; i < MAXLINE; i++){
        for (j = 0; j < MAXLINE; j++){
            if (a[j][max[i]] < a[i][max[i]]){
                found = 0;
            }
        }
        if (found){
            break;
        }else if (i == MAXLINE-1){
            break;
        }
        else{
            found = 1;
        }
    }
    if (found){
        cout << i+1 << " " << max[i]+1 << " " << a[i][max[i]];
    }else{
        cout << "not found";
    }
    
    return 0;
}

006:图像模糊处理

#include <iostream>
#include <cstdio>
using namespace std;

int main(int argc, char const *argv[])
{
    int m, n;
    scanf("%d %d", &m, &n);
    int a[m][n], b[m][n], i, j;
    for (i = 0; i < m; i++){
        for (j = 0; j < n; j++){
            scanf("%d", &a[i][j]);
            b[i][j] = a[i][j];
        }
    }
    for (i = 1; i < m-1; i++){
        for (j = 1; j < n-1; j++){
            b[i][j] = (2*(a[i][j-1]+a[i][j+1]+a[i][j]+a[i-1][j]+a[i+1][j])+5)/10;
        }
    }
    for (i = 0; i < m; i++){
        for (j = 0; j < n; j++){
            printf("%d ", b[i][j]);
        }
        printf("\n");
    }
    return 0;
}

007:矩阵转置

#include <iostream>
#include <cstdio>
using namespace std;

int main(int argc, char const *argv[])
{
    int m, n;
    cin >> m >> n;
    int a[m][n], i, j;
    for (i = 0; i < m; i++){
        for (j = 0; j < n; j++){
            cin >> a[i][j];
        }
    }
    for (j = 0; j < n; j++){
        for (i = 0; i < m; i++){
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

程序设计与算法(一)C语言程序设计 第六周习题(2019夏季)

001:Pell数列

#include <iostream>
#include <cstdio>
using namespace std;

int main(int argc, char const *argv[])
{
    int n;
    scanf("%d", &n);
    int a[1000000];
    a[0] = 1;
    a[1] = 2;
    int i;
    for (i = 2; i < 1000000; i++){
        a[i] = 2*a[i-1]+a[i-2];
        if (a[i] > 32767){
            a[i] %= 32767;
        }
    }
    int b[n];
    for (i = 0; i < n; i++){
        scanf("%d", &b[i]);
    }
    for (i = 0; i < n; i++){
        printf("%d\n", a[b[i]-1]%32767);
    }
    return 0;
}

002:求最大公约数问题

#include <iostream>
#include <cstdio>
using namespace std;

int main(int argc, char const *argv[])
{
    int a, b, tmp;
    cin >> a >> b;
    do{
        tmp = a%b;
        a = b;
        b = tmp;
    }while (tmp);
    cout << a;
    return 0;
}

003:编程填空:第i位替换

return 1<<i&m|~(1<<i)&n;

004:编程填空:第i位取反

return 1<<i^n;

005:编程填空:左边i位取反

return ~0<<32-i^n;

程序设计与算法(一)C语言程序设计 第七周习题(2019夏季)

001:统计数字字符个数

#include <iostream>
#include <cstdio>
using namespace std;

int main(int argc, char const *argv[])
{
    int counter = 0, c;
    while ((c = getchar()) != '\n'){
        if (c >= '0' && c <= '9'){
            counter++;
        }
    }
    cout << counter;
    return 0;
}

002:找第一个只出现一次的字符

#include <iostream>
#include <cstdio>
using namespace std;

char a[100000];
int b[26];

int main(int argc, char const *argv[])
{   
    int i;
    for (i = 0; i < 26; i++){
        b[i] = 0;
    }
    cin >> a;
    // int c;
    // while ((c = getchar()) != '\n'){
    //     b[c-'a']++;
    // }
    for (i = 0; a[i]; i++){
        b[a[i]-'a']++;
    }
    for (i = 0; a[i]; i++){
        if (b[a[i]-'a'] == 1){
            cout << a[i];
            break;
        }
    }
    if (a[i] == '\0'){
        cout << "no";
    }
    return 0;
}

003:石头剪子布

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int stoi(char *s);

int main(int argc, char const *argv[])
{   
    char player1S[10], player2S[10];
    int player1I, player2I, N;
    scanf("%d", &N);
    int i, a[N];
    for (i = 0; i < N; i++){
        scanf("%s %s", player1S, player2S);
        player1I = stoi(player1S);
        player2I = stoi(player2S);
        int t = player1I - player2I;
        if (t == 0){
            a[i] = 0;
        }else if (t == -1 || t == 2){
            a[i] = 1;
        }else{
            a[i] = -1;
        }
    }
    for (i = 0; i < N; i++){
        if (a[i] == -1){
            printf("%s\n", "Player2");
        }else if (a[i] == 1){
            printf("%s\n", "Player1");
        }else{
            printf("%s\n", "Tie");
        }
    }
    return 0;
}

int stoi(char *s){
    int p;
    if (!strcmp(s, "Rock"))
        p = -1;
    else if (!strcmp(s, "Scissors"))
        p = 0;
    else
        p = 1;
    return p;
}

004:最长最短单词

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

#define MAXSIZE 20000
#define MAXWORDSIZE 100
#define IN 1
#define OUT 0

char s[MAXSIZE];
char longest[MAXWORDSIZE];
char shortest[MAXWORDSIZE];
char tmp[MAXWORDSIZE];

int main(int argc, char const *argv[])
{   
    gets(s);
    int state = OUT, max = -1, min = MAXWORDSIZE+1, len;
    int i = 0, j = 0;
    while (1){
        if (s[i] == ' ' || s[i] == ',' || !s[i]){
            if (state == IN){
                tmp[j] = '\0';
                j = 0;
                len = strlen(tmp);
                if (len > max){
                    max = len;
                    strcpy(longest, tmp);
                }
                if (len < min){
                    min = len;
                    strcpy(shortest, tmp);
                }
                if (!s[i]){
                    break;
                }
            }else{
                i++;
                continue;
            }
            state = OUT;
            i++;
        }
        tmp[j++] = s[i++];
        state = IN;
    }
    printf("%s\n", longest);
    printf("%s\n", shortest);
    return 0;
}

005:密码翻译

#include <iostream>
#include <cstdio>
using namespace std;

#define MAXSIZE 80

char s[MAXSIZE];

int main(int argc, char const *argv[])
{   
    cin.getline(s, MAXSIZE);
    int i;
    for (i = 0; s[i]; i++){
        if (s[i] == 'z'){
            s[i] = 'a';
        }else if (s[i] == 'Z'){
            s[i] = 'A';
        }else if (s[i] >= 'a' && s[i] <= 'y' || s[i] >= 'A' && s[i] <= 'Y'){
            s[i] += 1;
        }
    }
    cout << s;
    return 0;
}

程序设计与算法(一)C语言程序设计 第八、九周习题(2019夏季)

001:指针练习:输出Hello

p = s; *p; p++

002:指针练习:输出Tesla

; *p1 != *p2; p1++

003:指针练习:ForEach

void (*f)(void *)

004:指针练习:Memcpy之一

int i;
    for (i = 0; i < n; i++){
        dest[i] = src[i];
    }

005:指针练习:double

a[1], 6

006:指针练习:Memcpy之二

    char *sourceCode = (char*)src;
    char *destination = (char*)dest;
    char b[size], i;
    for (i = 0; i < size; i++){
        b[i] = *sourceCode++;
    }
    char *tmp = b;
    for (i = 0; i < size; i++){
        *destination++ = *tmp++;
    }

007:指针练习:MyMax

void *MyMax(void *anArray, int sizeOfAnItem, int numberOfItem, 
    int (*comparisonFunction)(void *n1, void*n2)){
        char *tmp = (char*)anArray;
        int i;
        void *max = anArray;
        for (i = 0; i < numberOfItem; i++){
            if (comparisonFunction(tmp, max) > 0){
                max = tmp;
            }
            tmp = tmp+sizeOfAnItem;
        }
    return max;
}

008:指针练习:指向指针的指针

int **p = a;

009:指针练习:SwapMemory

    char *a1 = (char*)m1;
    char *a2 = (char*)m2;
    char c;
    int i;
    for (i = 0; i < size; i++){
        c = *a1;
        *a1++ = *a2;
        *a2++ = c;
    }

程序设计与算法(一)C语言程序设计 第十周习题(2019夏季)

001:成绩排序

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

struct student{
    char name[20];
    int score;
};

int main(){
    int n;
    scanf("%d", &n);
    int i;
    struct student a[20];
    for (i = 0; i < n; i++){
        scanf("%s %d", &a[i].name, &a[i].score);
    }
    struct student tmp;
    int j, index;
    for (i = 0; i < n; i++){
        tmp = a[i];
        index = i;
        for (j = i; j < n; j++){
            if (a[j].score > tmp.score){
                tmp = a[j];
                index = j;
            }else if (a[j].score == tmp.score){
                if (strcmp(tmp.name, a[j].name) > 0){
                    tmp = a[j];
                    index = j;
                }
            }
        }
        a[index] = a[i];
        a[i] = tmp;
    }
    for (i = 0; i < n; i++){
        printf("%s %d\n", a[i].name, a[i].score);
    }
    return 0;
}

002:分数线划定

#include <iostream>
#include <cstdio>

using namespace std;

struct candidate{
    int ID;
    int score;
};

int main(){
    int n, m;
    scanf("%d %d", &n, &m);
    int i;
    struct candidate a[n];
    for (i = 0; i < n; i++){
        scanf("%d %d", &a[i].ID, &a[i].score);
    }
    struct candidate tmp;
    int j, index;
    for (i = 0; i < n; i++){
        tmp = a[i];
        index = i;
        for (j = i; j < n; j++){
            if (a[j].score > tmp.score){
                tmp = a[j];
                index = j;
            }else if (a[j].score == tmp.score){
                if (a[j].ID < tmp.ID){
                    tmp = a[j];
                    index = j;
                } 
            }
        }
        a[index] = a[i];
        a[i] = tmp;
    }
    
    int t = m*3/2-1;
    tmp = a[t];
    int boundary = a[t].score;
    while (tmp.score == boundary){
        t++;
        tmp = a[t];
    }
    printf("%d %d\n", boundary, t);
    for (i = 0; i < t; i++){
        printf("%d %d\n", a[i].ID, a[i].score);
    }
    return 0;
}

003:病人排队

#include <iostream>
#include <cstdio>

#define BOUNDARY 60

using namespace std;

struct patient{
    char ID[10];
    int age;
};

int main(){
    int n;
    scanf("%d", &n);
    int i;
    struct patient a[n];
    for (i = 0; i < n; i++){
        scanf("%s %d", &a[i].ID, &a[i].age);
    }
    struct patient tmp;
    int j, index;
    for (i = 0; i < n; i++){
        for (j = n-1; j > i; j--){
            if (a[j].age >= BOUNDARY){
                if (a[j-1].age < a[j].age){
                    tmp = a[j];
                    a[j] = a[j-1];
                    a[j-1] = tmp;           
                }
            }
        }
    }
    
    for (i = 0; i < n; i++){
        printf("%s\n", a[i].ID);
    }
    return 0;
}

004:mysort

void mysort(void *t, int numberOfElement, unsigned int widthOfElement, 
    int(*fCompare)(const void *, const void *)){
        int i, j, k;
        char *p = (char*)t;
        char tmp;
        for (i = 0; i < numberOfElement; i++){
            for (j = numberOfElement-1; j > 0; j--){
                char *a, *b;
                a = p+(j)*widthOfElement;
                b = p+(j-1)*widthOfElement;
                if (fCompare(a, b) < 0){
                    for (k = 0; k < widthOfElement; k++){
                        tmp = *a;
                        *a++ = *b;
                        *b++ = tmp;
                    }
                }
            }
        }
        return;
}

005:从字符串中取数

    static char *start;
    if (str){
        start = str;
    }
    double f = 0;;
    for (; *start < '0' || *start > '9'; start++){
        if (*start == '\0'){
            return -1;
        }
    }
    for (; *start >= '0' && *start <= '9'; start++){
        f = 10*f+(*start-'0');
    }
    if (*start == '.'){
        int tmp = 1;
        start++;
        for (; *start >= '0' && *start <= '9'; start++){
            f = 10*f+(*start-'0');
            tmp *= 10;
        }
        f /= tmp;
    }
    return f;

程序设计与算法(一)C语言程序设计 第十一周习题(2019夏季)

001:派

#include <iostream>
#include <cstdio>

#define PI 3.141592653589793
#define EPS 0.00001 

using namespace std;

int main ()
{   
    int N, F;
    scanf("%d %d", &N, &F);
    int i, radius[N];
    double volume[N];
    double totalVolume = 0;
    for (i = 0; i < N; i++){
        scanf("%d", &radius[i]);
        volume[i] = PI*radius[i]*radius[i]; 
        totalVolume += volume[i]; 
    }
    double maxVolume = totalVolume/(F+1);
    double left = 0, right = maxVolume, mid;
    while (right-left >= EPS){
        mid = left+(right-left)/2;
        int k = 0;
        for (i = 0; i < N; i++){
            k += volume[i]/mid;
        }
        if (k >= F+1){
            maxVolume = mid;
            left = mid+EPS;
        }else{
            right = mid-EPS;
        }
    }
    printf("%.3f\n", maxVolume);
    return 0;
}

002:月度开销

#include <iostream>
#include <cstdio>

#define PI 3.141592653589793
#define EPS 0.00001 

using namespace std;

int main ()
{   
    int N, M;
    scanf("%d %d", &N, &M);
    int i, cost[N], sum = 0, min, max = 0;
    for (i = 0; i < N; i++){
        scanf("%d", &cost[i]);
        sum += cost[i];
        if (cost[i] > max){
            max = cost[i];
        }
    }
    min = sum;
    int left = max, right = sum, mid;
    while (left <= right){
        mid = left+(right-left)/2;
        int tmp = 0, numberOfFajomonth = 1;
        for (i = 0; i < N; i++){
            tmp += cost[i];
            if (tmp > mid){
                tmp = cost[i];
                numberOfFajomonth++;
            }else if (tmp == mid){
                tmp = 0;
                numberOfFajomonth++;
            }
        }
        if (numberOfFajomonth > M){
            left = mid+1;
        }else{
            if (mid < min){
                min = mid;
            }
            right = mid-1;
        }
    }
    printf("%d\n", min);
    return 0;
}

003:Aggressive cows

#include <iostream>
#include <cstdio>
#include <algorithm>

#define MAXLENGTH 1000000000

using namespace std;

int main ()
{   
    int N, C;
    scanf("%d %d", &N, &C);
    int i, stall[N]; 
    for (i = 0; i < N; i++){
        scanf("%d", &stall[i]);
    }
    sort(stall, stall+N);
    int left = 1, right = MAXLENGTH/C, mid;
    int max = 1;
    while (left <= right){
        mid = left+(right-left)/2;
        int j, k = 0;
        for (j = C; j-1 && k < N; j--){
            int t = stall[k]+mid;
            k++;
            while (k < N && stall[k] < t){
                k++;
            }
        }
        if (j > 1){
            right = mid-1;
        }else{
            if (k >= N){
                right = mid-1;
            }else{
                if (mid > max){
                    max = mid;
                }
                left = mid+1;
            }
        }
    }
    printf("%d\n", max);
    return 0;
}

程序设计与算法(一)C语言程序设计 第十二周习题(2019夏季)

001:sort简单题

a+1, a+7, greater<int>()

002:还是sort简单题

struct Rule1{
    bool operator()(const int & a1, const int & a2){
        if (a1%10 != a2%10){
            return a1%10 < a2%10;
        }else{
            return a1>a2;
        }
    }
};

struct Rule2{
    bool operator()(const Point & a1, const Point & a2){
        int t1, t2;
        t1 = a1.x*a1.x+a1.y*a1.y;
        t2 = a2.x*a2.x+a2.y*a2.y;
        if (t1 != t2){
            return t2>t1;
        }else{
            if (a1.x != a2.x){
                return a2.x>a1.x;
            }else{
                return a2.y>a1.y;
            }
        }
    }
};

003:Set

#include <iostream>
#include <set>
#include <cstring> 

using namespace std;

struct od{
    char a[4];
    int b;
};

int main()
{
    multiset<int> st;
    multiset<int> st_cpy;
    int n;
    scanf("%d", &n);
    int i;
    struct od order[n];
    for (i = 0; i < n; i++){
        scanf("%s %d", order[i].a, &order[i].b);
    }
    for (i = 0; i < n; i++){
        if (strcmp(order[i].a, "add") == 0){
            st.insert(order[i].b);
            st_cpy.insert(order[i].b);
            multiset<int>::iterator j;
            int t = 0;
            for (j = st.begin(); j != st.end(); j++){
                if (*j == order[i].b){
                    t++;
                }
            }
            printf("%d\n", t);
        }
        if (strcmp(order[i].a, "del") == 0){
            multiset<int>::iterator cs;
            int t = 0;
            for (cs = st.begin(); cs != st.end(); cs++){
                if (*cs == order[i].b){
                    t++;
                }
            }
            st.erase(order[i].b); 
            printf("%d\n", t);
        }
        if (strcmp(order[i].a, "ask") == 0){
            int ever;
            multiset<int>::iterator k;
            k = st_cpy.find(order[i].b);
            if (k == st_cpy.end()){
                ever = 0;
            }else{
                ever = 1;
            }
            printf("%d ", ever);
            multiset<int>::iterator j;
            int t = 0;
            for (j = st.begin(); j != st.end(); j++){
                if (*j == order[i].b){
                    t++;
                }
            }
            printf("%d\n", t);
        }
    }
    return 0;
}

004:热血格斗场

#include <iostream>
#include <set>
#include <cstring>
#include <cstdlib>

using namespace std;

struct member{
    int ID;
    long long power;
};

struct rule{
    bool operator()(const struct member & a1, const struct member a2){
        return a1.power < a2.power;
    }
};

struct competition{
    int freshmanID;
    int membershID;
}; 

struct member minp(struct member a, struct member b, struct member c);

int main()
{
    set<struct member, rule> st;
    int n;
    scanf("%d", &n);
    struct member a[n+1], tmpA, tmpB, tmp;
    struct competition c[n];
    a[0].ID = 1;
    a[0].power = 1000000000;
    st.insert(a[0]);
    int i;
    set<struct member, rule>::iterator j; 
    for (i = 1; i < n+1; i++){
        scanf("%d %lld", &a[i].ID, &a[i].power);
        j = st.lower_bound(a[i]);
        tmpA.power = j->power;
        tmpA.ID = j->ID;
        tmpB = tmpA;
        if (j != st.begin()){
            j--;
            tmpB.power = j->power;
            tmpB.ID = j->ID;
        }
        tmp = minp(tmpA, tmpB, a[i]);
        c[i-1].freshmanID = a[i].ID;
        c[i-1].membershID = tmp.ID;
        st.insert(a[i]);
    }
    for (i = 0; i < n; i++){
        printf("%d %d\n", c[i].freshmanID, c[i].membershID);
    }
    return 0;
}

struct member minp(struct member a, struct member b, struct member c){
    int t1, t2;
    t1 = abs(c.power-a.power);
    t2 = abs(c.power-b.power);
    if (t1 >= t2){
        return b;
    }else{
        return a;
    }
}

程序设计与算法(一)C语言程序设计 第十三周习题(2019夏季)

001:冷血格斗场

#include <iostream>
#include <map>
#include <cstring>
#include <cstdlib>

using namespace std;

struct competition{
    int freshmanID;
    int memberID;
};

int main()
{
    map<long long, int> st;
    int n;
    scanf("%d", &n);
    st[1000000000] = 1;
    struct competition c[n];
    int i, id;
    long long power, diff1, diff2;
    map<long long, int>::iterator j, jtmp; 
    for (i = 1; i < n+1; i++){
        scanf("%d %lld", &id, &power);
        j = st.lower_bound(power);
        if (j == st.end()){
            j--;
        }
        diff1 = abs(j->first-power);
        jtmp = j;
        diff2 = diff1;
        if (j != st.begin()){
            j--;
            diff2 = abs(j->first-power);
        }
        if (diff1 > diff2 || diff1 == diff2 && jtmp->second > j->second){
            jtmp = j;
        }
        c[i-1].freshmanID = id;
        c[i-1].memberID = jtmp->second;
        if (jtmp->first == power && jtmp->second < id){
            ;
        }else{
            st[power] = id;
        }
    }
    for (i = 0; i < n; i++){
        printf("%d %d\n", c[i].freshmanID, c[i].memberID);
    }
    return 0;
}

程序设计与算法(一)C语言程序设计 期末考试(2019夏季)

01:分段函数

#include <iostream>
#include <cstdio>

#define EPS 0.000001

using namespace std;

int main(){
    double x, y;
    scanf("%lf", &x);
    if (x>-EPS && x-5 < -EPS){
        y = -x+2.5;
    }else if (x-5 > -EPS && x-10 < -EPS){
        y = 2-1.5*(x-3)*(x-3);
    }else if (x-10 > -EPS && x-20 < -EPS){
        y = x/2-1.5;
    }
    printf("%.3f", y);
    return 0;
}

02:求分数序列和

#include <iostream>
#include <cstdio>

using namespace std;

int main(){
    double sum = 0;
    int n, p = 1, q = 2, tmp;
    scanf("%d", &n);
    for (int i = 0; i < n; i++){
        sum += 1.0*q/p;
        tmp = q;
        q = q+p;
        p = tmp;
    }
    printf("%.4f", sum);
    return 0;
}

03:画矩形

#include <iostream>
#include <cstdio>

using namespace std;

int main(){
    int height, width, isFilled;
    char fc;
    scanf("%d %d %c %d", &height, &width, &fc, &isFilled);
    for (int i = 0; i < height; i++){
        if (isFilled){
            for (int j = 0; j < width; j++){
                printf("%c", fc);
            }
        }else{
            if (i == 0 || i == height-1){
                for (int j = 0; j < width; j++){
                    printf("%c", fc);
                }
            }else{
                for (int j = 0; j < width; j++){
                    if (j == 0 || j == width-1){
                        printf("%c", fc);
                    }else{
                        printf(" ");
                    }
                }
            } 
        }
        printf("\n");
    }
    return 0;
}

04:求出e的值

#include <iostream>
#include <cstdio>

using namespace std;

int main(){
    double e = 1;
    int n;
    long long factorial;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++){
        factorial = 1;
        for (int j = 1; j <= i; j++){
            factorial *= j;
        }
        e += 1.0/factorial;
    }
    printf("%.10f", e);
    return 0;
}

05:计算多项式的值

#include <iostream>
#include <cstdio>

using namespace std;

int main(){
    float x, polynomial = 1, product = 1;
    int n;
    scanf("%f %d", &x, &n);
    for (int i = 1; i <= n; i++){
        product *= x;
        polynomial += product;
    }
    printf("%.2f", polynomial);
    return 0;
}

06:大整数加法

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

char a[210], b[210], c[210];

void reverse(char *s);
void plusHugeInt(char *a, char *b, char *sum);
void printHugeInt(char *s);

int main(){
    cin >> a >> b;
    reverse(a);
    reverse(b);
    plusHugeInt(a, b, c);
    printHugeInt(c); 
    return 0;
}

void reverse(char *s){
    int len = strlen(s), tmp;
    int i = 0, j = len-1;
    while (i < j){
        tmp = s[i];
        s[i] = s[j];
        s[j] = tmp;
        i++;
        j--;
    }
    return;
}

void plusHugeInt(char *a, char *b, char *c){
    int lenA = strlen(a), lenB = strlen(b);
    int i, jw = 0, sum;
    for (i = 0; i < lenA && i < lenB; i++){
        sum = a[i]-'0'+b[i]-'0'+jw;
        c[i] = sum%10+'0';
        jw = sum/10;
    }
    while (i < lenA){
        sum = a[i]-'0'+jw;
        c[i] = sum%10+'0';
        jw = sum/10;
        i++;
    }
    while (i < lenB){
        sum = b[i]-'0'+jw;
        c[i] = sum%10+'0';
        jw = sum/10;
        i++;
    }
    if (jw == 1){
        c[i++] = '1';
    }
    c[i] = '\0';
    return;
}

void printHugeInt(char *s){
    int j = -1, lenS = strlen(s);
    for (int i = 0; i < lenS; i++){
        if (s[i]-'0' > 0){
            j = i;
        }
    }
    if (j == -1 ){
        printf("0");
    }else{
        s[j+1] = '\0';
        for (int k = strlen(s)-1; k >= 0; k--){
            printf("%c", s[k]);
        }
    }
    return;
}

07:有趣的跳跃

#include <iostream>
#include <cstdlib>

using namespace std;

int main(){
    int n;
    cin >> n;
    if (n == 1){
        printf("Jolly");
    }else{
        int a[n], difference[n-1], check[n-1], isJolly = 1;
        for (int i = 0; i < n; i++){
            cin >> a[i];
        }
        for (int i = 0; i < n-1; i++){
            check[i] = 0;
            difference[i] = abs(a[i]-a[i+1]);
        }
        for (int i = 0; i < n-1; i++){
            if (difference[i] == 0 || difference[i] > n-1){
                break;
            }else{
                check[difference[i]-1] = 1;
            }
        }
        for (int i = 0; i < n-1; i++){
            if (check[i] == 0){
                printf("Not jolly");
                isJolly = 0;
                break;
            }
        }
        if (isJolly){
            printf("Jolly");
        }
    }
    return 0;
}

08:单词倒排

#include <iostream>
#include <cstring>

#define MAXSIZE 100

using namespace std;

char s[MAXSIZE];
char *p[MAXSIZE];

int main(){
    for (int i = 0; i < MAXSIZE; i++){
        p[i] = NULL;
    }
    cin.getline(s, MAXSIZE);
    char *tmp;
    tmp = strtok(s, " ");
    int i = 0;
    while (tmp){
        p[i++] = tmp;
        tmp = strtok(NULL, " ");
    }
    for (int j = i-1; j >= 0; j--){
        cout << p[j] << " ";
    }
    return 0;
}

09:行程长度编码

#include <iostream>
#include <cstring>
#include <cctype>

#define MAXSIZE 1000

using namespace std;

struct charAndNumber{
    char c;
    int n;
};

char s1[MAXSIZE];
struct charAndNumber s2[MAXSIZE];

int main(){
    cin >> s1;
    for (int i = 0; i < MAXSIZE; i++){
        s2[i].c = '\0';
        s2[i].n = 0;
    }
    s2[0].c = toupper(s1[0]);
    s2[0].n++;
    int len = strlen(s1), j = 0;
    for (int i = 1; i < len; i++){
        if (s1[i] == s2[j].c || s1[i]+'A'-'a' == s2[j].c){
            s2[j].n++;
        }else{
            j++;
            s2[j].c = toupper(s1[i]);
            s2[j].n++;
        }
    }
    for (int i = 0; i <= j; i++){
        cout << "(" << s2[i].c << "," << s2[i].n << ")";
    }
    return 0;
}

10:反反复复

#include <iostream>
#include <cstring>

#define MAXSIZE 200

using namespace std;

char s[MAXSIZE];

int main(){
    int line, row;
    cin >> row >> s;
    line = strlen(s)/row;
    for (int i = 0; i < row; i++){
        int k = i;
        /* 注意题目中并不是把字符串从上到下地一列一列填成的矩阵按每行
        从左到右输出,而是一行从左到右,一行从右到左。所以得到的加密后
        的字符串,可以把从右到左输出的部分先颠倒,再把一个矩阵一行一行
        输出。如果不想做颠倒这一步,就可以像下面这样,一行输出整数第a个,
        下一行输出倒数第a个。 */
        for (int j = 0; j < line; j++){
            printf("%c", s[j*row+k]);
            k = row-1-k;
        }
    }
    return 0;
}

11:网线主管

#include <cstdio>

using namespace std;

/* 这题一开始用的double,怎么都不行,有的时候自己电脑上可以,传上去也不行,
实在是无法理解,不知道怎么用double的变量来做。我是只能通通乘100用整数来了 */
int main(){
    int N, K;
    scanf("%d %d", &N, &K);
    int a[N];
    /* 注意,单位用厘米时,所有的都乘100,和sum用8字节的int可能就不够了。
    我有个测试数据过不了就是因为这个。 */
    long long sum = 0;
    double tmpA;
    for (int i = 0; i < N; i++){
        scanf("%lf", &tmpA);
        a[i] = tmpA*100;
        sum += a[i];
    }
    /* 枚举+二分法 */
    /* 注意,left不能用0,不然下面a[i]/mid的时候,除数可能为0,就出错了,
    有个测试数据过不了就是因为一开始left是0。我电脑上的提示是
    float exception:8。反正就是出错。况且题目中要求如果小于max小于1就输出0.00,
    所以也left也没必要设置成1以下的。 */
    int left = 1, right = sum/K, mid, max = 0;
    int tmp;
    while (left <= right){
        mid = left+(right-left)/2;
        tmp = 0;
        for (int i = 0; i < N; i++){
            tmp += a[i]/mid;
        }
        if (tmp >= K){
            max = mid;
            left = mid+1;
        }else{
            right = mid-1;
        }
    }
    if (max < 1){
        printf("0.00");
    }else{
        printf("%.2f", 1.0*max/100);
    }
    return 0;
}

12:查找最接近的元素

#include <iostream>

using namespace std;

int main(){
    int n, m;
    cin >> n;
    int a[n];
    for (int i = 0; i < n; i++){
        cin >> a[i];
    }
    cin >> m;
    int test, left, right, mid, l, r;
    for (int i = 0; i < m; i++){
        cin >> test;
        left = 0;
        right = n-1;
        l = a[0];
        r = a[n-1];
        while (left <= right){
            mid = left+(right-left)/2;
            if (a[mid] > test){
                r = a[mid];
                right = mid-1;
            }else{
                l = a[mid];
                left = mid+1;
            }
        }
        if (l == test){
            printf("%d\n", l);
        }else{
            if (test-l <= r-test){
                printf("%d\n", l);
            }else{
                printf("%d\n", r);
            }
        }
    }
    return 0;
}

13:1的个数

#include <iostream>

using namespace std;

int main(){
    int N;
    cin >> N;
    int n = N, cnt = 0;
    for (int i = 0; i < 32; i++){
        if (n&1 == 1){
            cnt++;
        }
        n >>= 1;
    }
    printf("%d", cnt);
    return 0;
}

14:判断元素是否存在

#include <iostream>
#include <cstdio>

#define MAXSIZE 100000

using namespace std;

int main(){
    long long a[MAXSIZE];
    int k, x;
    int isFind = 0;
    scanf("%d,%d", &k, &x);
    a[0] = k;
    for (int i = 1; i < MAXSIZE; i++){
        if (i%2 == 1){
            a[i] = 2*a[(i+1)/2-1]+1;
        }else{
            a[i] = 3*a[(i+1)/2-1]+1;
        }
    }
    for (int i = 0; i < MAXSIZE; i++){
        if (a[i] == x){
            isFind = 1;
            break;
        }
    }
    if (isFind){
        printf("YES");
    }else{
        printf("NO");
    }
    return 0;
}

【MOOC课程学习记录】程序设计与算法(一)C语言程序设计

原文:https://www.cnblogs.com/Orzst/p/11416125.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!