2023西工大NOJ (C语言版) 完结!!!

博客贴出100道C语言题目的全部AC代码,不保证代码质量,仅保证能AC。其中4道题WA,5道题使用CPP。作者认为题目质量不佳,仅81 - 90题值得做,还列出了考试时会携带的资料,包含各题目的具体内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

代码已同步至 gitee:程序设计基础实验 (C)

题目过于垃圾和睿智,做这种题简直是浪费生命,甚至会让代码水平剧烈下降,也就81-90题值得做一下,有这功夫不如多打会儿游戏。
贴出 100 题中全部 AC 代码,并不保证代码正确性、可读性、简洁性、最佳性,只能保证AC;目前 4 道题 WA,还有 5 道题使用 CPP。具体情况如下:

  • 41-50:飞机起飞速度(WA);
  • 51-60:字符串替换(WA);
  • 61-70:GPS通信协议(CPP);
  • 71-80:卫星定位(WA),日出日落时间(WA),火箭发射模拟(CPP),晶体结构(CPP),原子计数(CPP);
  • 81-90:危险的组合(CPP)。

考试模板

作者考试时会携带的资料如下:

// 字符串操作函数(常用)
// 为避免内存泄漏和野指针问题, 通常只能对开在栈上字符串使用, 而不能对开在堆上的字符串使用
# include <string.h>
// 失败时均返回NULL
void *memset(void *str, int c, size_t n); // 复制字符c到str的前n个字符.
// 使用memset对数组初始化时, 字符c只能为0或-1或0x3f.
void *memcpy(void *dest, const void *src, size_t n); // 从src复制n个字符到dest, 一般不用于src和dest内存重叠的情况.
void *memmove(void *dest, const void *src, size_t n); // 从src复制n个字符到dest, src和dest内存重叠时推荐使用.
size_t strlen(const char *str); // 返回str长度, 即头指针到'\0'的距离(但不包含'\0').
char *strcat(char *dest, const char *src); // 将src追加到dest结尾.
char *strchr(const char *str, int c); // 返回str中第一次出现字符c的位置.
char *strstr(const char *haystack, const char *needle); // 返回在haystack中第一次出现needle的起始位置.
size_t strspn(const char *str1, const char *str2); // str1中第一个不在str2出现的字符的下标
char *strtok(char *str, const char *delim); // 以delim为分隔, 分解str.
// 指针数组模板
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char id[64];
    int a;
    int b;
} PointerArray;

int main(){
    int n; scanf("%d", &n);
    PointerArray *arr[n];

    for (int i = 0; i < n; ++i) {
        arr[i] = (PointerArray*) calloc (sizeof(PointerArray), 1);
        scanf("%s %d %d", arr[i]->id, &arr[i]->a, &arr[i]->b);
    }

    for (int i = 0; i < n; ++i)
        printf("%s %d %d", arr[i]->id, arr[i]->a, arr[i]->b);
    return 0;
}
// 二维数组模板
#include <stdio.h>
#include <stdlib.h>

int** init(int n) {
    int** matrix = (int**)malloc(sizeof(int*) * (n + 1));
    for(int i = 0; i <= n; i++) {
        matrix[i] = (int*)malloc(sizeof(int) * (n + 1));
    }
    return matrix;
}

int op(int **matrix, int n);

int main() {
    int n;
    scanf("%d", &n);
    int **matrix = init(n);
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            scanf("%d", &matrix[i][j]);
        }
    }
    printf("%d", op(matrix, n));
    return 0;
}
// 快速排序模板: 从小到大
void quickSort(int arr[], int left, int right) {
	if (left >= right) return;
	int flag = arr[(left + right) / 2];
	int head = left - 1, tail = right + 1;
	while (head < tail) {
		do head++; while (arr[head] < flag); // 若从大到小需修改本行
		do tail--; while (arr[tail] > flag); // 若从大到小需修改本行
		if (head < tail) {
			int tmp = arr[head];
			arr[head] = arr[tail], arr[tail] = tmp;
		}
	}
	quickSort(arr, left, tail);
	quickSort(arr, tail + 1, right);
}
// 冒泡排序模板: 从小到大
#include <stdbool.h>

void bubble(int arr[], int n) {
    for (int i = 0; i < n - 1; ++i) {
        bool flag = false;
        for (int j = 0; j < n - i - 1; ++j) {
            if (arr[j] > arr[j + 1]) { // 若从大到小需修改本行
                int tmp = arr[j];
                arr[j] = arr[j + 1], arr[j + 1] = tmp, flag = true;
            }
        }
        if (!flag) break;
    }
}
// 二分查找模板
long long left = 1, right = 1e19, mid, ans;

while(left <= right) {
    mid = ((right - left) >> 1) + left;
    if (isLeft(mid)) right = mid - 1, ans = mid;
    else left = mid + 1;
}
// 文件读写模板
#include <stdio.h>
#include <stdlib.h>

int main(){
    int n; scanf("%d",&n);

    FILE *file = fopen("rr.dat", "w");
    for(int i=1;i<=n;i++)
        fprintf(file, "%d\n", i);
    fclose(file);

    file = fopen("rr.dat", "r");
    while (fscanf(file, "%d", &ans) == 1)
        printf("%d ", ans);
    fclose(file);
}

1-10

Hello World

#include<stdio.h>

int main(){
    printf("Hello World");
    return 0;
}

A+B

#include<stdio.h>

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

数据类型大小及范围

#include <stdio.h>
#include <limits.h>

int main(){
    int id = 0;
    scanf("%d",&id);
    switch (id) {
        case 1: // char
            printf("%llu,%d,%d\n",sizeof(char),CHAR_MIN,CHAR_MAX);
            break;
        case 2: // unsigned char
            printf("%llu,%u,%u\n",sizeof(unsigned char),0,UCHAR_MAX);
            break;
        case 3: // short
            printf("%llu,%hd,%hd\n",sizeof(short),SHRT_MIN,SHRT_MAX);
            break;
        case 4: // unsigned short
            printf("%llu,%hu,%hu\n",sizeof(unsigned short),0,USHRT_MAX);
            break;
        case 5: // int
            printf("%llu,%d,%d\n",sizeof(int),INT_MIN,INT_MAX);
            break;
        case 6: // unsigned int
            printf("%llu,%u,%u\n",sizeof(unsigned int),0,UINT_MAX);
            break;
        case 7: //long
            printf("%llu,%ld,%ld\n",sizeof(int),LONG_MIN,LONG_MAX);
            break;
        case 8: // unsigned long
            printf("%llu,%u,%lu\n",sizeof(unsigned long),0,ULONG_MAX);
            break;
        case 9: // long long
            printf("%llu,%lld,%lld\n",sizeof(int),LLONG_MIN,LLONG_MAX);
            break;
        case 10: // unsigned long long
            printf("%llu,%u,%llu\n",sizeof(unsigned long long),0,ULLONG_MAX);
            break;
    }
    return 0;
}

平均值

#include <stdio.h>

int main(){
    int a = 0, b = 0;
    scanf("%d %d",&a,&b);
    int c = ((b-a)>>1)+a;
    printf("%d",c);
    return 0;
}

进制转换

#include <stdio.h>

int main(){
    unsigned int a = 0;
    scanf("%d",&a);
    printf("%X,%o",a,a);
}

浮点数输出

#include <stdio.h>

int main(){
    double a = 0.0f;
    scanf("%lf",&a);
    printf("%.6lf,%.2lf,%.8lf",a,a,a);
    return 0;
}

动态宽度输出

#include <stdio.h>

int main(){
    int n = 0, m = 0, k = 0;
    scanf("%d %d",&n,&m);
    int tmp = n;
    while (tmp) {
        tmp /= 10;
        ++k;
    }
    for (int i = 0; i < m-k; ++i) {
        printf("%d",0);
    }
    printf("%d",n);
    return 0;
}

计算地球上两点之间的距离

#include <stdio.h>
#include <math.h>
#define RADIUS 6371.000000
#define PI 3.1415926

int main(){
    double phi1, phi2, lambda1, lambda2, distance;
    scanf("%lf %lf",&phi1,&lambda1);
    scanf("%lf %lf",&phi2,&lambda2);
    phi1 = phi1*PI/180;
    phi2 = phi2*PI/180;
    lambda1 = lambda1*PI/180;
    lambda2 = lambda2*PI/180;
    double havRatio = (1-cos(phi2-phi1))/2+cos(phi1)*cos(phi2)*(1-cos(lambda2-lambda1))/2;
    distance = asin(sqrt(havRatio))*2*RADIUS;
    printf("%.4lfkm",distance);
    return 0;
}

风寒指数

#include <stdio.h>
#include <math.h>

int main(){
    double v,T;
    scanf("%lf %lf",&v,&T);
    int chill = 13.12f+0.6215f*T-11.37f*pow(v,0.16f)+0.3965f*T*pow(v,0.16f)+0.5f;
    printf("%d",chill);
    return 0;
}

颜色模型转换

#include <stdio.h>
#include <stdio.h>
#include <math.h>

double findmax(double a, double b, double c) {
    return a >= b ? (a >= c ? a : c) : (b >= c ? b : c);
}

double findmin(double a, double b, double c) {
    return a <= b ? (a <= c ? a : c) : (b <= c ? b : c);
}

int main()
{
    int R, G, B;
    double r, g, b;
    double max, min;
    double H, S, V;

    scanf("%d %d %d",&R,&G,&B);

    r = (double)((R > 0 ? R : 0) / 255.0f);
    g = (double)((G > 0 ? G : 0) / 255.0f);
    b = (double)((B > 0 ? B : 0) / 255.0f);
    max = findmax(r, g, b);
    min = findmin(r, g, b);

    V = max;

    if (max < 1e-9) {
        S = 0.0f;
    }
    else {
        S = (max - min) / max;
    }

    if (max - min < 1e-9) {
        H = 0.0f;
    }
    else {
        if (max == r) {
            H = 60.0f * (g - b) / (max - min);
        }
        else if (max == g) {
            H = 60.0f * (2.0f + (b - r) / (max - min));
        }
        else if (max == b) {
            H = 60.0f * (4.0f + (r - g) / (max - min));
        }
        else {
            return -1;
        }

        if (H < 1e-9) {
            H = H + 360.0f;
        }
    }
    printf("%.4lf,%.4lf%%,%.4lf%%", H, S * 100, V * 100);
    return 0;
}

11-20

乘数模

#include<stdio.h>

int main(){
    long long a,b,m,r;
    scanf("%lld %lld %lld",&a,&b,&m);
    r = ((a%m)*(b%m))%m;
    printf("%lld",r);
    return 0;
}

方阵

#include<stdio.h>

int main(){
    int n,m;
    scanf("%d",&n);
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            m = (i-j) > 0 ? (i-j) : (j-i);
            printf("%d  ",m);
        }
        printf("\n");
    }

    return 0;
}

分数的加、减、乘、除法

#include<stdio.h>

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

int main(){
    int aTop, aBot, bTop, bBot;
    scanf("%d",&aTop);
    getchar();
    scanf("%d",&aBot);
    getchar();
    scanf("%d",&bTop);
    getchar();
    scanf("%d",&bBot);
    getchar();

    int addTop, addBot, subTop, subBot, multTop, multBot, divTop, divBot;
    int addGcd, subGcd, multGcd, divGcd;

    addTop = aTop*bBot+aBot*bTop;
    addBot = aBot*bBot;
    addGcd = gcd(addTop,addBot);
    addTop /= addGcd;
    addBot /= addGcd;


    subTop = aTop*bBot-aBot*bTop;
    subBot = aBot*bBot;
    subGcd = gcd(subTop,subBot);
    subTop /= subGcd;
    subBot /= subGcd;

    multTop = aTop*bTop;
    multBot = aBot*bBot;
    multGcd = gcd(multTop,multBot);
    multTop /= multGcd;
    multBot /= multGcd;

    divTop = aTop*bBot;
    divBot = aBot*bTop;
    divGcd = gcd(divTop,divBot);
    divTop /= divGcd;
    divBot /= divGcd;

    printf("(%d/%d)+(%d/%d)=%d/%d\n",aTop,aBot,bTop,bBot,addTop,addBot);
    printf("(%d/%d)-(%d/%d)=%d/%d\n",aTop,aBot,bTop,bBot,subTop,subBot);
    printf("(%d/%d)*(%d/%d)=%d/%d\n",aTop,aBot,bTop,bBot,multTop,multBot);
    printf("(%d/%d)/(%d/%d)=%d/%d\n",aTop,aBot,bTop,bBot,divTop,divBot);

    return 0;
}

操作数

#include<stdio.h>

int sumDig(int n){
    int sum = 0;
    while(n){
        sum += n%10;
        n /= 10;
    }
    return sum;

}

int main(){
    int n,cnt=0;
    scanf("%d",&n);

    while(n){
        n -= sumDig(n);
        ++cnt;
    }

    printf("%d",cnt);

    return 0;
}

组合数

#include<stdio.h>

int main(){

    int cnt = 0, n, m;
    scanf("%d",&n);

    for(int a = 0; a <= 9; ++a){
        for(int b = 0; b <= 9; ++b){
            for(int c = 0; c <= 9; ++c){
                for(int d = 0; d <= 9; ++d){
                    m = a+b+c+d;
                    if (m == n){
                        ++cnt;
                    }
                }

            }
        }
    }

    printf("%d",cnt);

    return 0;
}

比率

#include<stdio.h>
#include<math.h>

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

int cntDig(double x){
    int cnt = 0;
    while(x != floor(x)){
        ++cnt;
        x *= 10;
    }
    return cnt;
}

int main(){

    double x;
    scanf("%lf",&x);

    int cnt = cntDig(x), n, m, g;
    m = pow(10,cnt);
    n = (int)(x*m);
    g = gcd(m,n);
    m /= g;
    n /= g;

    printf("%d/%d",n,m);
    return 0;
}

级数和

#include<stdio.h>
#include<math.h>

double decimal (int n){
    double m = (double)n+1;
    while(floor(m)){
        m /= 10;
    }
    return m+n;
}

int main(){
    int n;
    scanf("%d",&n);
    double sum = 0.0f, term;
    for (int i = 1; i < n; ++i) {
        term = decimal(i);
        sum += term;
        printf("%g+",term);
    }
    term = decimal(n);
    sum += term;
    printf("%g=%g",term,sum);

    return 0;
}

对称数

#include <stdio.h>

int main(){

    int n;
    scanf("%d",&n);

    int a = (n/100)%10;
    int b = (n/10)%10;
    int c = n%10;

    if ((b == 0 || b == 1 || b == 8) && ((a == 6 && c == 9) || (a == 9 && c == 6) || ((a == 0 || a == 1 || a == 8) && (c == 0 || c == 1 || c == 8)))){
        printf("Yes\n");
    } else {
        printf("No\n");
    }

    return 0;
}

幂数模

#include<stdio.h>

typedef unsigned long long uint64;

int fastPowerMod (uint64 t, uint64 e, uint64 m){
    uint64 r = 1;
    while (e){
        if (e&1){
            r = (1LL*r*t)%m;
        }
        t = (1LL*t*t)%m;
        e >>= 1;
    }
    return r;
}

int main(){
    uint64 a,b,m,r;
    scanf("%llu %llu %llu",&a,&b,&m);
    r = fastPowerMod(a,b,m);
    printf("%llu",r);
    return 0;
}

倍数和

#include <stdio.h>

int main(){
    unsigned int t = 0;
    unsigned int arrn[100000];
    scanf("%u", &t);
    for(unsigned int i = 0; i < t; i++){
        scanf("%u", &arrn[i]);
    }

    for(unsigned int j = 0; j < t; j++){
        unsigned int res = 0;
        for(unsigned int x = 1; x < arrn[j]; x++){
            if(x % 3 == 0 || x % 5 == 0){
                res += x;
            }
        }
        printf("%u\n", res);
    }

    return 0;
}

21-30

余数和

#include <stdio.h>

int main() {
    unsigned int sum = 0, n, k;
    scanf("%u %u",&n,&k);
    for (unsigned int i = 1; i <= n; ++i) {
        sum += k%i;
    }
    printf("%u",sum);
    return 0;
}

最大数字

#include <stdio.h>
#include <stdbool.h>

bool isNonDecr(unsigned int n){
    unsigned int left;
    while(n){
        left = (n/10)%10;
        if (left > (n%10)){
            return false;
        }
        n /= 10;
    }
    return true;
}

int main() {
    unsigned int n, res;
    scanf("%u",&n);
    while(!isNonDecr(n)){
        --n;
    }
    printf("%u",n);
    return 0;
}

倒水(原 AC 后 TE 现又 AC)

#include <stdio.h>
#include <string.h>

#define INF 0x3f3f3f3f

const int maxSize = 10000;
int distTable[10000][10000];
int queue[2][10000] = {0};

int bfs(int n, int m, int d){
    int head = 0, tail = 1;
    memset(distTable, 0x3f, sizeof(distTable));
    distTable[0][0] = 0;

    while(tail != head){
        int a = queue[0][head], b = queue[1][head];
        if (a == d || b == d) {
            return distTable[a][b];
        }

        ++head;
        if(head == maxSize-1) {
            head = 0;
        }

        // full
        if(distTable[a][m] == INF) {
            distTable[a][m] = distTable[a][b]+1;
            ++tail;
            queue[0][tail] = a;
            queue[1][tail] = m;
        }
        if(distTable[n][b] == INF) {
            distTable[n][b] = distTable[a][b]+1;
            ++tail;
            queue[0][tail] = n;
            queue[1][tail] = b;
        }

        // empty
        if(distTable[a][0] == INF) {
            distTable[a][0] = distTable[a][b]+1;
            ++tail;
            queue[0][tail] = a;
            queue[1][tail] = 0;
        }
        if(distTable[0][b] == INF) {
            distTable[0][b] = distTable[a][b]+1;
            ++tail;
            queue[0][tail] = 0;
            queue[1][tail] = b;
        }

        // pour
        if(a+b <= n && distTable[a+b][0] == INF){
            distTable[a+b][0] = distTable[a][b]+1;
            ++tail;
            queue[0][tail] = a+b;
            queue[1][tail] = 0;
        }
        if(a+b > n && distTable[n][a+b-n] == INF){
            distTable[n][a+b-n] = distTable[a][b]+1;
            ++tail;
            queue[0][tail] = n;
            queue[1][tail] = a+b-n;
        }
        if(a+b <= m && distTable[0][a+b] == INF){
            distTable[0][a+b] = distTable[a][b]+1;
            ++tail;
            queue[0][tail] = 0;
            queue[1][tail] = a+b;
        }
        if(a+b > m && distTable[a+b-m][m] == INF){
            distTable[a+b-m][m] = distTable[a][b]+1;
            ++tail;
            queue[0][tail] = a+b-m;
            queue[1][tail] = m;
        }

        if (tail == maxSize) {
            tail = 0;
        }
    }

    return -1;
}

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

好数字

#include <stdio.h>

typedef unsigned long long uint64;
const uint64 mod = 1e9+7;

uint64 power(uint64 a, uint64 e){
    uint64 r = 1;
    while (e){
        if (e&1){
            r = (r*a)%mod;
        }
        a = (a*a)%mod;
        e >>= 1;
    }
    return r;
}

int main(){
    uint64 n, num;
    scanf("%llu",&n);
    num = power(4,n/2)*power(5,n-n/2)%mod;
    printf("%llu",num);
    return 0;
}

毕达哥拉斯三元组

#include <stdio.h>

unsigned long long pythagoras(unsigned int sum){
    // a as short catheti, b as long catheti, c as hypotenuse
    unsigned a,b,c;
    for (a = 1; a <= sum/4; ++a){
        for (b = a+1; b <= sum/2; ++b){
            c = sum-a-b;
            if ((a+b > c) & (c-a < b) & (a*a+b*b == c*c)){
                return a*b*c;
            }
        }
    }
}

int main(){
    unsigned int n;
    scanf("%u",&n);
    printf("%d", pythagoras(n));
    return 0;
}

竖式乘法

#include <stdio.h>
#include <math.h>

typedef unsigned int uint;

uint digit(uint x){
    uint cnt = 0;
    if (x == 0){
        return 1;
    }
    while(x){
        x /= 10;
        ++cnt;
    }
    return cnt;
}

uint getDigital(uint x, uint n){
    x /= (uint)pow(10,n-1);
    return x%10;
}

int main(){
    uint up, down;
    scanf("%u %u",&up,&down);
    uint ans = up*down, len = digit(ans)+1, downLen = digit(down);

    for (uint i = 0; i < len-digit(up); ++i) {
        printf(" ");
    }
    printf("%u\n",up);
    printf("x");
    for (uint i = 1; i <= len-downLen-1; ++i) {
        printf(" ");
    }
    printf("%u\n",down);

    for (uint i = 1; i <= len; ++i) {
        printf("-");
    }
    printf("\n");

    uint tmp;
    for (uint i = 1; i <= downLen; ++i) {
        tmp = getDigital(down,i)*up;
        if (i == downLen){
            printf("+");
        } else {
            for (uint j = 1; j <= len-digit(tmp)-i+1; ++j) {
                printf(" ");
            }
        }
        printf("%u\n",tmp);
    }

    for (uint i = 1; i <= len; ++i) {
        printf("-");
    }
    printf("\n");

    printf(" %u",ans);

    return 0;
}

查找数列

#include <stdio.h>

int main(){
    int cnt = 1, sum = 0, n, res;
    scanf("%d",&n);
    while(n-sum > 0){
        sum += cnt;
        ++cnt;
    }
    sum -= cnt;
    res = n-sum == 0 ? cnt : (n-sum-1);
    printf("%d",res);
    return 0;
}

俄罗斯农夫乘法

#include <stdio.h>

int main(){
    int multi = 0, a, b;
    scanf("%d %d",&a,&b);
    while(a){
        printf("%d %d\n",a,b);
        if (a&1) {
            multi += b;
        }
        a >>= 1;
        b <<= 1;
    }
    printf("%d",multi);
    return 0;
}

阶乘倍数

#include <stdio.h>
#include <stdbool.h>
 
typedef unsigned long long int64;
 
int64 primeFactNum = 0;
int64 prime[20] = {0}, num[20] = {0};

bool isMulti(int64 n){
    int64 primeNum, tmp;
    for (int64 i = 1; i <= primeFactNum; ++i) {
        primeNum = 0;
        tmp = n;
        while (tmp) {
            primeNum += tmp/prime[i];
            tmp /= prime[i];
        }
        if(primeNum < num[i]) {
            return false;
        }
    }
    return true;
}

void solveFact(int64 k){
    for (int64 i = 2; i*i <= k; ++i) {
        if(k%i == 0){
            ++primeFactNum;
            prime[primeFactNum] = i;
            while (k%i == 0){
                ++num[primeFactNum];
                k /= i;
            }
        }
    }
    if (k > 1){
        ++primeFactNum;
        prime[primeFactNum] = k;
        ++num[primeFactNum];
    }
}
 
int main(){
    int64 left = 1, right = 1e19, mid, n, k;
    scanf("%lld",&k);
    solveFact(k);
 
    while(left <= right){
        mid = ((right-left)>>1)+left;
        if (isMulti(mid)){
            right = mid-1;
            n = mid;
        } else {
            left = mid+1;
        }
    }
    printf("%lld",n);
    return 0;
}

方案数

#include <stdio.h>

int main(){
    int cnt = 0, n;
    scanf("%d",&n);
    for (int i = 1; i*(i+1) <= 2*n; ++i) {
        if ((n-i*(i-1)/2)%i == 0){
            ++cnt;
        }
    }
    printf("%d",cnt);
    return 0;
}

31-40

哈沙德数

#include <stdio.h>

int HarshadNumber(int n){
    int t = n, s = 0;
    while (t) {
        s += t%10;
        t /= 10;
    }
    if ((s == 0) || (n%s != 0)) return 0;
    if (s == 1) return 1;
    return n/s;
}

int main(){
    int cnt = 0, n;
    scanf("%d",&n);
    if (n == 1) cnt = 1;
    while ((n != 0) && (n != 1)) {
        n = HarshadNumber(n);
        if (n) ++cnt;
    }
    printf("%d",cnt);
    return 0;
}

素数

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

typedef unsigned long long uint64;

uint64 primeNum(uint64 a, uint64 b){
    bool isPrime[b+1];
    memset(isPrime,1,b+1);
    uint64 cnt = 0;
    for (uint64 i = 2; i <= b; ++i){
        if (isPrime[i]){
            for (uint64 j = 2; j*i <= b; ++j){
                isPrime[j*i] = false;
            }
        }
    }
    for (uint64 i = a; i <= b; ++i){
        cnt += isPrime[i];
    }
    return cnt;
}

int main(){
    uint64 a,b,num;
    scanf("%llu %llu",&a,&b);
    num = primeNum(a,b);
    printf("%llu",num);
    return 0;
}

基思数

#include <stdio.h>

int arr[8] = {0};

int init(int n){
    int cnt = 0;
    while (n) {
        arr[cnt++] = n%10;
        n /= 10;
    }
    return cnt;
}

void isKeith(int n, int len){
    int i = len - 1;
    while (arr[i] < n){
        int sum = 0;
        for (int j = 0; j < len; ++j) {
            sum += arr[(i-j+len)%len];
        }
        arr[i] = sum;
        i = (i-1+len)%len;
    }
    if (arr[i] == n) printf("Yes");
    else printf("No");
}

int main() {
    int n;
    scanf("%d",&n);
    isKeith(n,init(n));
    return 0;
}

二进制表示

#include <stdio.h>
#include <stdbool.h>

void binary(int a){
    bool flag = false;
    for (int i = 15; i >= 0 ; --i) {
        if ((a>>i)&1) {
            if (flag) printf("+");
            if (i >= 2){
                printf("2(");
                binary(i);
                printf(")");
            }
            if (i == 1) printf("2");
            if (i == 0) printf("2(0)");
            flag = true;
        }
    }
}

int main() {
    int a;
    scanf("%d",&a);
    binary(a);
    return 0;
}

光线追踪

#include <stdio.h>

unsigned int gcd(unsigned int a, unsigned int b){
    if (b == 0) return a;
    return gcd(b,a%b);
}

int main(){
    unsigned int n,x,l;
    scanf("%u %u",&n,&x);
    l = 3*(n-gcd(n,x));
    printf("%u",l);
    return 0;
}

冰雹数列

#include <stdio.h>

int main() {
    int n;
    scanf("%d",&n);
    while (n != 1) {
        printf("%d ",n);
        if (n&1) n = 3 * n + 1;
        else n /= 2;
    }
    printf("1");
    return 0;
}

佩尔数

#include <stdio.h>

int PA(int n){
    if (n == 0) return 0;
    else if (n == 1) return 1;
    return 2*PA(n-1)+PA(n-2);
}

int PB(int n){
    int p0 = 0, p1 = 1, pn;
    for (int i = 0; i <= n; ++i) {
        if (i == 0) pn = p0;
        else if (i == 1) pn = p1;
        else {
            pn = 2 * p1 + p0;
            p0 = p1;
            p1 = pn;
        }
    }
    return pn;
}

int main() {
    int n, p;
    scanf("%d",&n);
    if (n&1) p = PA(n);
    else p = PB(n);
    printf("%d",p);
    return 0;
}

可变参数累加

#include <stdio.h>
#include <stdarg.h>

int sum(int start,...){
    va_list vaList;
    int sum = 0;
    int curr = start;
    va_start(vaList,start);
    while (start){
        sum += start;
        start = va_arg(vaList,int);
    }
    va_end(vaList);
    return sum;
}

int main() {
    int a,b,c,d,e,f;
    scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f);
    int sumMinus = sum(a,b,0) - sum(c,d,e,f,0);
    printf("%d",sumMinus);
    return 0;
}

运动会

#include <stdio.h>
#include <stdbool.h>

int phiEuler(int n){
    int phi[n+1],prime[n+1];
    bool isSieved[n+1];
    int sum = 0,cnt = 1, comp;
    prime[0] = 1;
    phi[1] = 1;
    for (int i = 2; i < n; ++i){
        if (!isSieved[i]){
            prime[cnt++] = i;
            phi[i] = i-1;
        }
        for (int j = 1; i*prime[j] <= n; ++j){
            comp = i*prime[j];
            isSieved[comp] = true;
            if (i%prime[j] == 0){
                phi[comp] = prime[j]*phi[i];
                break;
            } else{
                phi[comp] = (prime[j]-1)*phi[i];
            }
        }
    }
    for (int i = 1; i <= n-1; ++i) {
        sum += phi[i];
    }
    return sum;
}

int main() {
    int n, num;
    scanf("%d",&n);
    num = n == 1 ? 0 : (2*phiEuler(n)+1);
    printf("%d",num);
    return 0;
}

可变参数平均

#include <stdio.h>
#include <stdarg.h>

double avg(int num,...){
    va_list vaList;
    double sum = 0.0f;
    va_start(vaList,num);
    for (int i = 0; i < num; ++i) {
        sum += va_arg(vaList,int);
    }
    va_end(vaList);
    return sum/num;
}

int main() {
    int a,b,c,d,e;
    scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
    double avgMinus = avg(2,a,b) - avg(3,c,d,e);
    printf("%.4f",avgMinus);
    return 0;
}

41-50

航空旅行

#include<stdio.h>
#include<stdbool.h>

void pass(int a, int b, int c, int d, int e){
    bool flag = false;
    if (a <= e && (b + c) <= d) flag = true;
    if (b <= e && (a + c) <= d) flag = true;
    if (c <= e && (a + b) <= d) flag = true;
    if (flag) printf("YES\n");
    else printf("NO\n");
}

int main(){
    int n, a, b, c, d, e;
    scanf("%d",&n);
    while (n--){
        scanf("%d %d %d %d %d", &a, &b, &c, &d, &e);
        pass(a, b, c, d, e);
    }
    return 0;
}

蒙特卡罗法求积分

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

double func1(double x) {
    return pow(x, 4) * exp(-x);
}

double func2(double x) {
    return x * x + 1;
}

double func3(double x) {
    return cos(x);
}

double func4(double x) {
    return sqrt(x) * (x - 2);
}

double func5(double x) {
    return 2 * sin(x) - 5 * cos(x);
}

double func(int m, double x) {
    switch (m) {
        case 1: return func1(x);
        case 2: return func2(x);
        case 3: return func3(x);
        case 4: return func4(x);
        case 5: return func5(x);
        default: return 0;
    }
}

double mtk(int m, double a, double b, int n) {
    srand(RAND_MAX);
    double w = b - a, sum = 0;
    for (int i = 1; i < n; ++i) {
        double x = ((double)rand() / RAND_MAX) * w + a;
        sum += func(m, x);
    }
    sum *= w / n;
    return sum;
}

int main() {
    int m, n;
    double a, b;
    scanf("%d %lf %lf %d", &m, &a, &b, &n);
    printf("%.6lf", mtk(m, a, b, n));
    return 0;
}

飞机起飞速度(WA)

稀疏矩阵

#include <stdio.h>

int main () {
    int raw, col, n, num = 0;
    scanf("%d %d", &raw, &col);
    for (int i = 0; i < raw; ++i) {
        for (int j = 0; j < col; ++j) {
            scanf("%d", &n);
            if (n) ++num;
        }
    }
    double ratio = (double)num / (raw * col);
    if (num == raw || num == col || (ratio - 0.05) <= 1e-9)
        printf("Yes\n");
    else printf("No\n");
    return 0;
}

回文数之和

#include <stdio.h>
#include <stdbool.h>

int dec[10] = {0}, kSys[32] = {0};

bool isPalindrome(int arr[], int cnt){
    int head = 0, tail = cnt - 1;
    while (head < tail) {
        if (arr[head] != arr[tail]) return false;
        ++head, --tail;
    }
    return true;
}

bool isBiPalindrome(int n, int k){
    int tmp = n, cnt = 0;
    while (tmp) {
        dec[cnt++] = tmp % 10;
        tmp /= 10;
    }
    if (!isPalindrome(dec, cnt)) return false;

    tmp = n, cnt = 0;
    while (tmp) {
        kSys[cnt++] = tmp % k;
        tmp /= k;
    }
    if (!isPalindrome(kSys, cnt)) return false;
    return true;
}

int main() {
    int n, k, sum = 0;
    scanf("%d %d", &n, &k);
    for (int i = 1; i <= n; ++i) {
        if (isBiPalindrome(i, k)) sum += i;
    }
    printf("%d", sum);
    return 0;
}

完美矩阵

#include <stdio.h>
#include <stdbool.h>

#define MAXSIZE 301

int arr[MAXSIZE][MAXSIZE] = {0};
int preSum[MAXSIZE][MAXSIZE] = {0};

void prefix(int n, int m){
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            preSum[i][j] = preSum[i - 1][j] + preSum[i][j - 1]
                           - preSum[i - 1][j - 1] + arr[i][j];
        }
    }
}

int getSum(int x1, int x2, int y1, int y2) {
    return preSum[x2][y2] - preSum[x1 - 1][y2] - preSum[x2][y1 - 1]
           + preSum[x1 - 1][y1 - 1];
}

bool isPerfect(int x1, int x2, int y1, int y2) {
    int outer = getSum(x1, x2, y1, y2), inner;
    int len = 2 * (x2 - x1 + y2 - y1);
    if ((x2 - x1) == 1 || (y2 - y1) == 1) inner = 0;
    else inner = getSum(x1 + 1, x2 - 1, y1 + 1, y2 - 1);

    if (inner != 1 && inner != 0 && inner != -1) return false;
    if ((outer - inner) != len) return false;
    return true;
}

int perfectNum(int n, int m) {
    int cnt = 0;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            for (int k = 1; k + i <= n && k + j <= m; ++k) {
                if (arr[i][k + j] == 0 || arr[k + i][j] == 0) break;
                if (isPerfect(i, i + k, j, j + k)) {
                    ++cnt;
                }
            }
        }
    }
    return cnt;
}

int main () {
    int n, m;
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            scanf("%d", &arr[i][j]);
            if (arr[i][j] == 0) arr[i][j] = -1;
        }
    }
    prefix(n ,m);
    printf("%d", perfectNum(n, m));
    return 0;
}

波士顿房价预测

#include <stdio.h>

double nAvg(double arr[], int n) {
    double sum = 0;
    for (int i = 0; i < n; ++i) {
        sum += arr[i];
    }
    return sum / n;
}

int main() {
    int n;
    scanf("%d", &n);
    double x[n], y[n];
    for (int i = 0; i < n; ++i) {
        scanf("%lf %lf", &x[i], &y[i]);
    }

    double xBar = nAvg(x, n), yBar = nAvg(y, n);
    double sumUp = 0, sumDown = 0;
    for (int i = 0; i < n; ++i) {
        sumUp += (x[i] - xBar) * (y[i] - yBar);
    }
    for (int i = 0; i < n; ++i) {
        sumDown += (x[i] - xBar) * (x[i] - xBar);
    }
    double b = sumUp / sumDown;
    double a = yBar - b * xBar;

    printf("Y=%.4lf+%.4lf*X",a,b);
    return 0;
}

行列式值

#include <stdio.h>

#define MAX_SIZE 10

void swapRows(double matrix[MAX_SIZE][MAX_SIZE], int row1, int row2, int n) {
    for (int i = 0; i < n; i++) {
        double temp = matrix[row1][i];
        matrix[row1][i] = matrix[row2][i];
        matrix[row2][i] = temp;
    }
}

double calculateDeterminant(double matrix[MAX_SIZE][MAX_SIZE], int n) {
    int i, j, k;
    double determinant = 1.0;

    for (i = 0; i < n; i++) {
        if (matrix[i][i] == 0.0) {
            for (j = i + 1; j < n; j++) {
                if (matrix[j][i] != 0.0) {
                    swapRows(matrix, i, j, n);
                    determinant *= -1.0;
                    break;
                }
            }
        }

        if (matrix[i][i] == 0.0) {
            return 0.0;
        }

        double pivot = matrix[i][i];
        determinant *= pivot;
        for (j = i; j < n; j++) {
            matrix[i][j] /= pivot;
        }

        for (j = i + 1; j < n; j++) {
            double factor = matrix[j][i];
            for (k = i; k < n; k++) {
                matrix[j][k] -= factor * matrix[i][k];
            }
        }
    }

    return determinant;
}

int main() {
    int n;
    scanf("%d", &n);

    double matrix[MAX_SIZE][MAX_SIZE];

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%lf", &matrix[i][j]);
        }
    }

    double determinant = calculateDeterminant(matrix, n);
    printf("%.0lf\n", determinant);

    return 0;
}
#include <stdio.h>
#include <stdlib.h>

int** init(int n) {
    int** matrix = (int**)malloc(sizeof(int*) * (n + 1));
    for(int i = 0; i <= n; i++) {
        matrix[i] = (int*)malloc(sizeof(int) * (n + 1));
    }
    return matrix;
}

int det(int **matrix, int n) {
    if (n == 1) return matrix[1][1];
    int sum = 0;
    int **subMatrix = init(n - 1);
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n - 1; ++j) {
            for (int k = 1; k <= n - 1; ++k) {
                if (k < i) subMatrix[j][k] = matrix[j + 1][k];
                else subMatrix[j][k] = matrix[j + 1][k + 1];
            }
        }
        int sgn = i % 2 == 0 ? -1 : 1;
        sum += sgn * matrix[1][i] * det(subMatrix, n - 1);
    }
    return sum;
}

int main() {
    int n;
    scanf("%d", &n);
    int **matrix = init(n);
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            scanf("%d", &matrix[i][j]);
        }
    }
    printf("%d", det(matrix, n));
    return 0;
}

货运优化

#include <stdio.h>

int main() {
    int l3s2[4] = {0, 5, 3, 1};
    int n, x1, x2, x3, x4, x5, x6, s2, s1;
    while (1) {
        scanf("%d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6);
        if ((x1 + x2 + x3 + x4 + x5 + x6) == 0) break;
        n = (x3 + 3) / 4 + x4 + x5 + x6;
        s2 = 5 * x4 + l3s2[x3 % 4];
        if (x2 > s2) n += (x2 - s2 + 8) / 9;
        s1 = 36 * n - 36 * x6 - 25 * x5 - 16 * x4 - 9 * x3 - 4 * x2;
        if (x1 > s1) n += (x1 - s1 + 35) / 36;
        printf("%d\n",n);
    }
    return 0;
}

素数筛法

#include <stdio.h>
#include <stdbool.h>

#define NUM (int)1e7+1

static bool isSieved[NUM];
static int prime[NUM];

int main() {
    int n, k = 0;
    scanf("%d", &n);
    isSieved[1] = true;
    for (int i = 2; i <= n; ++i) {
        if (!isSieved[i]) prime[++k] = i;
        for (int j = 1; prime[j] * i <= n; ++j) {
            isSieved[prime[j] * i] = true;
            if (i % prime[j] == 0) break;
        }
    }
    printf("%d", k);
}

51-60

字符串替换(WA)

删除前后缀

#include <stdio.h>
#include <string.h>

void strRemovePrefix(char *str, char *prefix) {
    int cnt = 0;
    char *pStr = str, *pPrefix = prefix;
    while (*pPrefix && *pStr && *pStr == *pPrefix) {
        while (*pPrefix && *pStr && *pStr == *pPrefix)
            ++pStr, ++pPrefix, ++cnt;
        pPrefix = prefix;
    }

    int len = strlen(prefix);
    int mov = (cnt / len) * len;
    if (mov) memmove(str - mov, str, strlen(str) + 1);
}

void strRemoveSuffix(char *str, char *suffix) {
    int len = strlen(suffix);
    char *pStr = str + strlen(str) - len, *pSuffix = suffix;
    while (*pSuffix && pStr >= str && *pStr == *pSuffix) {
        int cnt = 0;
        while (*pSuffix && pStr && *pStr == *pSuffix)
            ++pStr, ++pSuffix, ++cnt;
        if (cnt == len) {
            pSuffix = suffix, pStr = pStr - 2 * len;
            *(pStr + len) = '\0';
        } else break;
    }
}

int main() {
    char str1[1000] = "", fix[1000] = "", str2[1000] = "";
    scanf("%[^\n] %[^\n]", str1, fix);
    memcpy(str2, str1, strlen(str1) + 1);

    strRemovePrefix(str1, fix);
    puts(str1);
    strRemoveSuffix(str2, fix);
    puts(str2);
    return 0;
}

大小写交换

#include <stdio.h>

void strSwapCase(char str[]) {
    for (int i = 0; str[i] != '\0'; ++i) {
        if ('a' <= str[i] && str[i] <= 'z')
            str[i] = (char) str[i] - 'a' + 'A';
        else if ('A' <= str[i] && str[i] <= 'Z')
            str[i] = (char) str[i] - 'A' + 'a';
    }
}

int main() {
    char input[1000] = "";
    scanf("%[^\n]",input);
    strSwapCase(input);
    puts(input);
    return 0;
}

前后缀移除

#include <stdio.h>
#include <string.h>

void strLeftStrip(char *str, char *chars) {
    int mov = 0;
    char *pStr = str;
    while (*pStr) {
        if (strchr(chars, *pStr)) ++mov;
        else break;
        ++pStr;
    }
    if (mov) memmove(str - mov, str, strlen(str) + 1);
}

void strRightStrip(char *str, char *chars) {
    int len = 0;
    char *pStr = str + strlen(str) - 1;
    while (pStr >= str) {
        if (strchr(chars, *pStr)) ++len;
        else break;
        --pStr;
    }
    *(str + strlen(str) - len) = '\0';
}

int main() {
    char str1[1000] = "", chars[1000] = "", str2[1000] = "";
    scanf("%[^\n] %[^\n]", str1, chars);
    memcpy(str2, str1, strlen(str1) + 1);

    strLeftStrip(str1, chars);
    puts(str1);
    strRightStrip(str2, chars);
    puts(str2);
    strRightStrip(str1, chars);
    puts(str1);
    return 0;
}

字符串后缀

#include <stdio.h>
#include <string.h>

void strEndsWith(char *str, char *suffix) {
    int len = strlen(suffix);
    char *pStr = str + strlen(str) - len, *pSuffix = suffix;
    while (*pSuffix && *pStr) {
        if (*pSuffix != *pStr) {
            printf("No\n");
            return;
        }
        else ++pSuffix, ++pStr;
    }
    printf("Yes\n");
}

int main() {
    char str[1000] = "", suffix[1000] = "";
    scanf("%[^\n] %[^\n]", str, suffix);
    strEndsWith(str, suffix);
    return 0;
}

Atol转换

#include <stdio.h>
#include <limits.h>

int atol(char *str) {
    char *pStr = str;
    int sgn = 1;
    long long tmp = 0;
    if (*pStr == '+') ++pStr;
    else if (*pStr == '-') sgn = -1, ++pStr;

    while (*pStr) {
        if (*pStr == ' ') ;
        else if ('0' <= *pStr && *pStr <= '9') {
            tmp = (*pStr - '0') + tmp * 10;
            if ((tmp * sgn) >= INT_MAX) return INT_MAX;
            else if ((tmp * sgn) <= INT_MIN) return INT_MIN;
        }
        else break;
        ++pStr;
    }
    return tmp * sgn;
}

int main() {
    char str[1000] = "";
    scanf("%[^\n]", str);
    printf("%d", atol(str));
    return 0;
}

元宇宙A+B

#include <stdio.h>
#include <string.h>

const static char decToMeta[37] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static char c[100] = "", a[100] = "", b[100] = "";
static int C[100] = {0}, A[100] = {0}, B[100] = {0};

int metaToDec(char m) {
    if ('0' <= m && m <= '9') return m - '0';
    return m - 'A' + 10;
}

void add(void) {
    int lenA = strlen(a), lenB = strlen(b);
    for (int i = 0; i < lenA; ++i) A[i] = metaToDec(a[lenA - i - 1]);
    for (int i = 0; i < lenB; ++i) B[i] = metaToDec(b[lenB - i - 1]);

    int carry = 0;
    int lenC = lenA > lenB ? lenA : lenB;
    for (int i = 0; i < lenC; ++i) {
        C[i] = A[i] + B[i] + carry;
        carry = C[i] / 36;
        C[i] %= 36;
    }
    if (carry != 0) {
        C[lenC] = carry;
        ++lenC;
    }

    for (int i = lenC - 1; i >= 0; --i) c[i] = decToMeta[C[lenC - i - 1]];
    c[lenC] = '\0';
}

int main() {
    scanf("%s %s", a, b);
    add();
    puts(c);
    return 0;
}

字符串切片

#include <stdio.h>
#include <string.h>

int t, n, len;
char str[1000];

void strSlice(int begin, int end, int step) {
    char slice[1000] = "";
    int pos = 0;
    if (begin < 0) begin += len;
    if (end < 0) end += len;
    if (end >= begin && step > 0) {
        for (int i = begin; i < end; i += step) {
            slice[pos] = str[i];
            ++pos;
        }
    } else if (end < begin && step < 0) {
        for (int i = begin; i > end; i += step) {
            slice[pos] = str[i];
            ++pos;
        }
    }
    puts(slice);
}

void mode(void) {
    len = strlen(str);
    int begin, end, step;
    switch (n) {
        case 3: {
            scanf("%d %d %d", &begin, &end, &step);
            break;
        }
        case 2: {
            scanf("%d %d", &begin, &end);
            step = 1;
            break;
        }
        case 1: {
            scanf("%d", &begin);
            end = len, step = 1;
            break;
        }
    }
    strSlice(begin, end, step);
}

int main() {
    scanf("%[^\n] %d", str, &t);
    for (int i = 0; i < t; ++i) {
        scanf("%d", &n);
        mode();
    }
    return 0;
}

分离字符串

#include <stdio.h>
#include <string.h>

void split(char *str, char *sep) {
    while (*str) {
        char *flag = strstr(str, sep);
        if (flag == NULL) break;
        char sub[101] = "";
        int len = flag - str;
        memcpy(sub, str, len);
        puts(sub);
        memmove(str - len - strlen(sep), str, strlen(str) + 1);
    }
    puts(str);
}

int main() {
    char str[2000] = "", sep[2000] = "";
    scanf("%[^\n] %[^\n]", str, sep);
    split(str, sep);
    return 0;
}

Kids A+B

#include <stdio.h>
#include <string.h>

char ans[30] = "";

int strToNum(char *str) {
    if(strstr(str, "zero")) return 0;
    if(strstr(str, "ten")) return 10;
    if(strstr(str, "eleven")) return 11;
    if(strstr(str, "twelve")) return 12;
    if(strstr(str, "thirteen")) return 13;
    if(strstr(str, "fourteen")) return 14;
    if(strstr(str, "fifteen")) return 15;
    if(strstr(str, "sixteen")) return 16;
    if(strstr(str, "seventeen")) return 17;
    if(strstr(str, "eighteen")) return 18;
    if(strstr(str, "nineteen")) return 19;

    int unit = 0, decade = 0;
    if(strstr(str, "one")) unit = 1;
    if(strstr(str, "two")) unit = 2;
    if(strstr(str, "three")) unit = 3;
    if(strstr(str, "four")) unit = 4;
    if(strstr(str, "five")) unit = 5;
    if(strstr(str, "six")) unit = 6;
    if(strstr(str, "seven")) unit = 7;
    if(strstr(str, "eight")) unit = 8;
    if(strstr(str, "nine")) unit = 9;
    if(strstr(str, "twenty")) decade = 20;
    if(strstr(str, "thirty")) decade = 30;
    if(strstr(str, "forty")) decade = 40;
    if(strstr(str, "fifty")) decade = 50;
    if(strstr(str, "sixty")) decade = 60;
    if(strstr(str, "seventy")) decade = 70;
    if(strstr(str, "eighty")) decade = 80;
    if(strstr(str, "ninety")) decade = 90;
    return unit + decade;
}

void numToStr(int n) {
    switch (n) {
        case 0: {
            strcpy(ans, "zero");
            char *p = ans;
            return;
        }
        case 11: {
            strcpy(ans, "eleven");
            char *p = ans;
            return;
        }
        case 12: {
            strcpy(ans, "twelve");
            char *p = ans;
            return;
        }
        case 13: {
            strcpy(ans, "thirteen");
            char *p = ans;
            return;
        }
        case 14: {
            strcpy(ans, "fourteen");
            char *p = ans;
            return;
        }
        case 15: {
            strcpy(ans, "fifteen");
            char *p = ans;
            return;
        }
        case 16: {
            strcpy(ans, "sixteen");
            char *p = ans;
            return;
        }
        case 17: {
            strcpy(ans, "seventeen");
            char *p = ans;
            return;
        }
        case 18: {
            strcpy(ans, "eighteen");
            char *p = ans;
            return;
        }
        case 19: {
            strcpy(ans, "nineteen");
            char *p = ans;
            return;
        }
        default:
            break;
    }

    int decade = (n / 10) % 10, unit = n % 10;
    switch (decade) {
        case 2: {
            strcpy(ans, "twenty");
            break;
        }
        case 3: {
            strcpy(ans, "thirty");
            break;
        }
        case 4: {
            strcpy(ans, "forty");
            break;
        }
        case 5: {
            strcpy(ans, "fifty");
            break;
        }
        case 6: {
            strcpy(ans, "sixty");
            break;
        }
        case 7: {
            strcpy(ans, "seventy");
            break;
        }
        case 8: {
            strcpy(ans, "eighty");
            break;
        }
        case 9: {
            strcpy(ans, "ninety");
            break;
        }
        default: {
            break;
        }
    }

    if (decade && unit) strcat(ans, "-");

    switch (unit) {
        case 1: {
            strcat(ans, "one");
            break;
        }
        case 2: {
            strcat(ans, "two");
            break;
        }
        case 3: {
            strcat(ans, "three");
            break;
        }
        case 4: {
            strcat(ans, "four");
            break;
        }
        case 5: {
            strcat(ans, "five");
            break;
        }
        case 6: {
            strcat(ans, "six");
            break;
        }
        case 7: {
            strcat(ans, "seven");
            break;
        }
        case 8: {
            strcat(ans, "eight");
            break;
        }
        case 9: {
            strcat(ans, "nine");
            break;
        }
        default: {
            break;
        }
    }
}

int main() {
    char a[30] = "", b[30] = "";
    scanf("%s %s", a, b);

    numToStr(strToNum(a) + strToNum(b));
    puts(ans);
    return 0;
}

61-70

时钟A-B

#include <stdio.h>
#include <time.h>

int main(){
	struct tm begin = {0}, end = {0};
	scanf("%d %d %d", &begin.tm_year, &begin.tm_mon, &begin.tm_mday);
	scanf("%d %d %d", &end.tm_year, &end.tm_mon, &end.tm_mday);

	begin.tm_year -= 1900, begin.tm_mon -= 1;
	end.tm_year -= 1900, end.tm_mon -= 1;

	time_t tmBegin =  mktime(&begin);
	time_t tmEnd = mktime(&end);
	printf("%.6lf", difftime(tmBegin, tmEnd));
	return 0;
}

加密字串

#include <stdio.h>

static int freq[26] = {0};

int main() {
	char plain[8000] = "";
	int x;
	scanf("%s %d", plain, &x);
	for (int i = 0; plain[i]; ++i) ++freq[plain[i] - 'a'];
	char cipher[8000] = "";
	for (int i = 0; plain[i]; ++i) {
		if (freq[plain[i] - 'a'] & 1)
			cipher[i] = (char) (((plain[i] - 'a' - x) % 26 + 26) % 26 + 'a');
		else
			cipher[i] = (char) ((plain[i] - 'a' + x) % 26 + 'a');
	}
	puts(cipher);
	return 0;
}

Arduino显示

#include <stdio.h>

static const int digit[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};

int getUnit(int num) {
	int cnt = 0;
	do {
		cnt += digit[num % 10];
		num /= 10;
	} while (num);
	return cnt;
}

int main() {
	int n;
	scanf("%d", &n);
	n -= 4;
	if (n <= 0) printf("0");
	else {
		int cnt = 0;
		for (int i = 0; i <= 1111; ++i) {
			for (int j = 0; j <= 1111; ++j) {
				if (getUnit(i) + getUnit(j) + getUnit(i + j) == n) ++cnt;
			}
		}
		printf("%d", cnt);
	}
	return 0;
}

有效表达式

#include <stdio.h>

int main() {
	long long n;
	scanf("%lld", &n);
	long long cnt = 1;
	for (long long i = n + 2; i <= 2 * n; ++i) cnt *= i;
	for (long long i = 1; i <= n; ++i) cnt /= i;
	printf("%lld", cnt);
	return 0;
}

长安

#include <stdio.h>

int bx, by, px, py, cnt;

void dfs(int x, int y) {
	if ((x == px && y == py) || x > bx || y > by) return;
	if (x == bx && y == by) {
		++cnt;
		return;
	}
	dfs(x + 1, y);
	dfs(x, y + 1);
}

int main() {
	while (1) {
		fflush(stdin);
		scanf("%d %d %d %d", &bx, &by, &px, &py);
		if (bx <= 0 || by <= 0 || px <= 0 || py <= 0) break;
		cnt = 0;
		dfs(1, 1);
		printf("%d\n", cnt);
	}
	return 0;
}

GPS通信协议(CPP)

感谢 Sekiro_2 提供的代码~

#include <bits/stdc++.h>

using namespace std;

string out[100];
int k=0;

int check(string str){
    int i,result;

    for(result=str[1],i=2;str[i]!='*';i++)
    {
        result^=str[i];
    }
    return result;
}

int convert(string str){
    int res=0;
    res=stoi(str,0,16);
    return res;
}


void convert_BeingTime(string utcTime){
    int  hour=stoi(utcTime.substr(0,2));
    int  B_hour=(hour+8)%24;
    if(B_hour/10==0)
        out[k++]="0"+to_string(B_hour)+":"+utcTime.substr(2,2)+":"+utcTime.substr(4,2);
    else
        out[k++]=to_string(B_hour)+":"+utcTime.substr(2,2)+":"+utcTime.substr(4,2);

}

int main(){
    string str;
    while(cin>>str){
        if(str=="END") break;
        if(str.compare(0,6,"$GPRMC")==0){
            size_t asteriskPos = str.find('*');
            if(asteriskPos!=string::npos){
                int checksum=check(str);
                
                int senchecksum=convert(str.substr(asteriskPos + 1, 2));
                if(checksum!=senchecksum) {
                    out[k++]="error";
          
                }
                else{
                    string utcTime = str.substr(7, 6);
     
                    convert_BeingTime(utcTime);
                }
            }
        }

    }
    for(int i=0;i<k;i++){
        cout<<out[i]<<endl;
    }
}

三元搜索

#include <stdio.h>

int terSearch(int arr[], int n, int k) {
	int left = 0, right = n - 1, mid1 = (n - 1) / 3, mid2 = n - mid1;
	while(mid1 != mid2) {
		if (k > arr[right] || k < arr[left]) return -1;
		if (k == arr[mid1]) return mid1;
		if (k == arr[mid2]) return mid2;
		if (mid1 == mid2) break;
		if (k < arr[mid1]) right = mid1 - 1;
		else if (k > arr[mid2]) left = mid2 + 1;
		else left = mid1 + 1, right = mid2 - 1;
		mid1 = left + (right - left) / 3, mid2 = right - (right - left) / 3;
	}
	return -1;
}

int main() {
	int n, k;
	scanf("%d", &n);
	int arr[n];
	for (int i = 0; i < n; ++i) scanf("%d", &arr[i]);
	scanf("%d", &k);
	printf("%d in [%d]", k, terSearch(arr, n, k));
	return 0;
}

DNA双螺旋结构

#include <stdio.h>

void putsDna1(){
	printf("   AT   \n");
	printf("  T--A  \n");
	printf(" A----T \n");
	printf("T------A\n");
	printf("T------A\n");
	printf(" G----C \n");
	printf("  T--A  \n");
	printf("   GC   \n");
}

void putsDna2(){
	printf("   CG   \n");
	printf("  C--G  \n");
	printf(" A----T \n");
	printf("A------T\n");
	printf("T------A\n");
	printf(" A----T \n");
	printf("  A--T  \n");
	printf("   GC   \n");
}

void putsDna3(){
	printf("   AT   \n");
	printf("  C--G  \n");
	printf(" T----A \n");
	printf("C------G\n");
	printf("C------G\n");
	printf(" T----A \n");
	printf("  G--C  \n");
	printf("   AT   \n");
}

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n/2; ++i) {
		if (i % 3 == 1) putsDna1();
		else if (i % 3 == 2) putsDna2();
		else putsDna3();
	}
	return 0;
}

PID控制

#include <stdio.h>

typedef struct PIDController {
	double Kp, Ki, Kd;
	double preError, integral;
} PIDData;

double PIDCalculate(PIDData *pid, double setPoint, double measuredValue) {
	double error = setPoint - measuredValue;
	pid->integral += error;
	double differential = error - pid->preError;
	double output = pid->Kp * error + pid->Ki * pid->integral + pid->Kd * differential;
	pid->preError = error;
	return output;
}

int main() {
	double setPoint, measuredValue;
	int time;
	PIDData pid = {0};
	scanf("%lf %lf %lf", &pid.Kp, &pid.Ki, &pid.Kd);
	scanf("%lf %lf %d", &setPoint, &measuredValue, &time);
	for (int i = 1; i <= time; ++i) {
		double output = PIDCalculate(&pid, setPoint, measuredValue);
		measuredValue += output;
		printf("%d %.6lf\n", i, measuredValue);
	}
	return 0;
}

循环排序

#include <stdio.h>

void swap(int *a, int *b) {
	int tmp = *a;
	*a = *b, *b = tmp;
}

void cycleSort(int arr[], int n) {
	for (int i = 0; i < n - 1; ++i) {
		int item = arr[i], pos = i;
		for (int j = i + 1; j < n; ++j) if (arr[j] < item) ++pos;
		if (pos == i) continue;

		swap(&arr[pos], &item);
		while(pos != i) {
			pos = i;
			for (int j = i + 1; j < n; ++j) if (arr[j] < item) ++pos;
			while (item == arr[pos]) ++pos;
			swap(&arr[pos], &item);
		}
	}
}

int main() {
	int n;
	scanf("%d", &n);
	int arr[n];
	for (int i = 0; i < n; ++i) scanf("%d", &arr[i]);
	cycleSort(arr, n);
	for (int i = 0; i < n; ++i) printf("%d ", arr[i]);
	return 0;
}

71-80

卫星定位(WA)

热能计算

#include <stdio.h>

int main() {
	int Ti, Tf, cL, cV;
	double mL, mV;
	scanf("%d %d %lf %d %lf %d", &Ti, &Tf, &mL, &cL, &mV, &cV);
	double QL = cL * mL * (Tf - Ti);
	double QV = cV * mV * (Tf - Ti);
	double Q = QL + QV;
	printf("%.2lfkJ,%.2lf%%,%.2lf%%\n", Q / 1000, QV / Q, QL / Q);
	return 0;
}

/*
20 80
0.250 4186
0.500 900
*/

几何约束

#include <stdio.h>
#include <stdbool.h>

int maxi(int a, int b) {
	return a > b ? a : b;
}

int mini(int a, int b) {
	return a < b ? a : b;
}

int cross(int x1, int y1, int x2, int y2) {
	return x1 * y2 - y1 * x2;
}

bool insert(int line1[4], int line2[4]) {
	if (maxi(line2[0], line2[2]) < mini(line1[0], line1[2]) ||
	maxi(line1[0],line1[2]) < mini(line2[0], line2[2]) ||
	maxi(line2[1], line2[3]) < mini(line1[1], line1[3]) ||
	 maxi(line1[1], line2[3]) < mini(line2[1],line2[3])) return false;
	if (cross(line1[2] - line1[0], line1[3] - line1[1], line2[0] - line1[0], line2[1] - line1[1]) *
		cross(line1[2] - line1[0], line1[3] - line1[1], line2[2] - line1[0], line2[3] - line1[1]) > 0 ||
		cross(line2[2] - line2[0], line2[3] - line2[1], line1[0] - line2[0], line1[1] - line2[1]) *
			cross(line2[2] - line2[0], line2[3] - line2[1], line1[2] - line2[0], line1[3] - line2[1]) > 0) return false;
	return true;
}

int main() {
	int n;
	scanf("%d", &n);
	int line[n][4];
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < 4; ++j) scanf("%d", &line[i][j]);

	int cnt = 0;
	for (int i = 0; i < n; ++i) {
		for (int j = i + 1; j < n; ++j) {
			if (insert(line[i], line[j])) {
				printf("X: #%d #%d\n", i + 1, j + 1);
				++cnt;
			}
		}
	}
	printf("n=%d\n", cnt);
	return 0;
}

/*
5
1 5 4 5
2 5 10 1
3 2 10 3
6 4 9 4
7 1 8 1
*/

日出日落时间(WA)

中位数

#include <stdio.h>

int arr[1000];

double mid(int n) {
	if (n & 1) return arr[n / 2];
	return (arr[n / 2] + arr[n / 2 - 1]) / 2.0f;
}

int main() {
	int flag, cnt = 0;
	while(1) {
		scanf("%d", &flag);
		if (flag == -1) break;
		while (1) {
			if (flag == 0) {
				for (int i = 0; i < cnt; ++i) printf("%d ", arr[i]);
				printf("%.6lf\n", mid(cnt));
				break;
			}
			arr[cnt++] = flag;
			scanf("%d", &flag);
		}
	}
	return 0;
}

原子计数(CPP)

感谢 Cubeist 提供的代码~

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

string s;

int getnum(int x)
{
    int res = 0;
    for (; s[x]>='0' && s[x]<='9' && s[x]; x ++)
        res = res * 10 + s[x] - '0';
    return res + !res;
}

int main()
{
    getline(cin, s);
    map<string, int> mp;
    for (int i = 0; s[i]; i ++)
    {
        if (!(s[i]>='A' && s[i]<='Z')) continue;
        string ele = "";
        ele += s[i];
        
        if (s[i+1]>='a' && s[i+1]<='z')
        {
            ele += s[i+1];
            mp[ele] += getnum(i+2);
        }
        else 
            mp[ele] += getnum(i+1);
    }

    for (auto& p : mp)
        cout << p.first << " " << p.second << endl;
        
    return 0;
}

成绩单

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct tag {
	long long id;
	char name[31];
	int score;
} ST;

void load(ST* arr[], int n) {
	for (int i = 0; i < n; ++i) {
		arr[i] = (ST*) malloc(sizeof(ST));
		scanf("%lld %s %d", &arr[i]->id, arr[i]->name, &arr[i]->score);
	}
}

void sort(ST* arr[], int n) {
	ST* tmp = NULL;
	for (int i = 0; i < n; ++i) {
		bool isSwapped = false;
		for (int j = 0; j < n - 1 - i; ++j)
			if ((arr[j]->score < arr[j + 1]->score) ||
				(arr[j]->score == arr[j + 1]->score && arr[j]->id > arr[j + 1]->id))
				tmp = arr[j], arr[j] = arr[j + 1], arr[j + 1] = tmp, isSwapped = true;
		if (!isSwapped) break;
	}
}

void traverse(ST* arr[], int n) {
	for (int i = 0; i < n; ++i)
		printf("%lld %s %d\n", arr[i]->id, arr[i]->name, arr[i]->score);
}

int main() {
	int n;
	scanf("%d", &n);
	ST* grade[n];
	load(grade, n);
	sort(grade, n);
	traverse(grade, n);
	return 0;
}

/*
6
2001900001 Jerry 88
2001900005 Tom 92
2001900006 Milla 85
2001900002 Alice 80
2001900003 Mickey 85
2001900004 Aladdin 83
*/

水下声学定位

#include<stdio.h>
#include<math.h>

int main()
{
	const double pi = 3.1415926f;
	double a, b, c, d, diag;
	scanf("%lf %lf %lf %lf %lf", &a, &b, &c, &d, &diag);
	double p = (a + b + diag) / 2, q = (c + d + diag);
	double s = sqrt(p * (p - a) * (p - b) * (p - diag)) + sqrt(q * (q - c) * (q - d) * (q - diag));
	double angle = atan((4 * s) / (pow(b, 2) + pow(d, 2) - pow(a, 2) - pow(c, 2)));
	angle *= 180 / pi;
	printf("%.6lf %.1lf", s, angle);
}

火箭发射模拟(CPP)

感谢 De1ta_Zer0 提供的代码~

#include <iostream>
#include <iomanip>
 
const double timeStep = 0.1;
 
int main()
{
    double totalMass, rocketMass, burnTime, cE, g;
    std::cin >> totalMass >> rocketMass >> burnTime >> cE >> g;
    double propellantMass = totalMass - rocketMass;
    double massFlow = propellantMass / burnTime;
    double T = massFlow * cE;
    double altitude = 0, V = 0;
    double timeLeft = burnTime + timeStep;
    while(timeLeft >= 0)
    {
        double a = T / totalMass;
        double deltaV = a * timeStep;
        double deltaAltitude = V * timeStep;
        double deltaM = massFlow * timeStep;
        V += deltaV;
        altitude += deltaAltitude;
        totalMass -= deltaM;
        timeLeft -= timeStep;
    }
    std::cout << std::fixed << std::setprecision(3) << altitude / 1000 << "km" << std::endl;
    return 0;
}

晶体结构(CPP)

感谢 De1ta_Zer0 提供的代码~

#include <iostream>
#include <string>
#include <iomanip>
#include <cmath>
 
struct Atom
{
    std::string name;
    double mass;
    double APF;
    double r;
};
 
Atom elemList[] =
{
    { "Po",   208.998, 0.52360, 1.68 },
    { "Li",     6.941, 0.68017, 1.52 },
    { "Na", 22.989770, 0.68017, 1.86 },
    { "Cr",   51.9961, 0.68017, 1.28 },
    { "Mn", 54.938049, 0.68017, 1.27 },
    { "Fe",    55.845, 0.68017, 1.26 },
    { "Mo",     95.94, 0.68017, 1.39 },
    { "Ta",  180.9749, 0.68017, 1.46 },
    { "Al", 26.981538, 0.74048, 1.43 },
    { "Ca",    40.078, 0.74048, 1.97 },
    { "Ni",   58.6934, 0.74048, 1.24 },
    { "Cu",    63.546, 0.74048, 1.28 },
    { "Ge",     72.64, 0.74048, 1.22 },
    { "Ag",  107.8682, 0.74048, 1.44 },
    { "Pt",   195.078, 0.74048, 1.39 },
    { "Au", 196.96655, 0.74048, 1.44 },
    { "Pb",     207.2, 0.74048, 1.75 }
};
 
template <int N> double pow(double a) { return a * pow<N - 1>(a); }
 
template <> double pow<0>(double a) { return 1; }
 
int main()
{
 
    int n;
    std::cin >> n;
    for (int i = 0; i < n; ++i)
    {
        std::string in;
        std::cin >> in;
        for(const auto& e : elemList)
        {
            if(e.name == in)
            {
                double V = 4.0 * M_PI * pow<3>(e.r) / 3.0;
                std::cout << std::fixed << std::setprecision(2) << 10.0 * e.mass * e.APF / 6.022 / V << std::endl;
                break;
            }
        }
    }
    return 0;
}

81-90

上楼梯

#include <stdio.h>
#include <string.h>

int main() {
	int n, m;
	scanf("%d %d", &n, &m);
	long long dp[n + 1];
	memset(dp, -1, (n + 1) * sizeof(long long));
	for (int i = 0; i < m; ++i) {
		int tmp;
		scanf("%d", &tmp);
		dp[tmp] = 0;
	}

	dp[1] = dp[1] ? 1 : 0;
	dp[2] = dp[2] ? (dp[1] ? 2 : 1) : 0;
	for (int i = 3; i <= n; ++i)
		if(dp[i]) dp[i] = (dp[i - 1] + dp [i - 2]) % (long long) (1e9 + 7);
	printf("%lld\n", dp[n]);
	return 0;
}

绝对差

#include <stdio.h>
#include <limits.h>
#include <time.h>
#include <stdlib.h>

void quickSort(int arr[], int left, int right) {
	if (left >= right) return;
	srand(time(NULL));
	int idx = rand() % (left - right) + left;
	int flag = arr[idx], head = left - 1, tail = right + 1;
	while (head < tail) {
		do head++; while(arr[head] < flag);
		do tail--; while(arr[tail] > flag);
		if (head < tail) {
			int tmp = arr[head];
			arr[head] = arr[tail];
			arr[tail] = tmp;
		}
	}
	quickSort(arr, left, tail);
	quickSort(arr, tail + 1, right);
}

int minAbsSub(int arr[], int n) {
	int min = INT_MAX;
	for (int i = 0; i < n - 1; ++i) {
		int tmp = arr[i + 1] - arr[i];
		if (tmp < min) min = tmp;
	}
	return min;
}

int main() {
	int n;
	scanf("%d", &n);
	int arr[n];
	for (int i = 0; i < n; ++i) scanf("%d", &arr[i]);

	quickSort(arr, 0, n - 1);
	printf("%d", minAbsSub(arr, n));
	return 0;
}

挑选

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <time.h>

void quickSort(long long arr[], long long left, long long right) {
	if (left >= right) return;
	srand(time(NULL));
	long long idx = rand() % (left - right) + left;
	long long flag = arr[idx], head = left - 1, tail = right + 1;
	while (head < tail) {
		do head++; while(arr[head] < flag);
		do tail--; while(arr[tail] > flag);
		if (head < tail) {
			long long tmp = arr[head];
			arr[head] = arr[tail];
			arr[tail] = tmp;
		}
	}
	quickSort(arr, left, tail);
	quickSort(arr, tail + 1, right);
}

long long maxi(long long arr[], long long n) {
	long long max = LLONG_MIN;
	for (long long i = 0; i < n; ++i)
		if (max < arr[i]) max = arr[i];
	return max;
}

long long sumMax(long long arr[], long long n) {
	long long dp[n];
	dp[0] = arr[0];
	for (long long i = 1; i < n; ++i) {
		if (arr[i] == arr[i - 1])
			dp[i] = dp[i - 1] > (arr[i] + dp[i - 1]) ? dp[i - 1] : (arr[i] + dp[i - 1]);
		else {
			long long j = i - 1;
			while (j >= 0 && arr[j] >= arr[i] - 1) --j;
			dp[i] = arr[i] + (j >= 0 ? dp[j] : 0);
		}
	}
	return maxi(dp, n);
}

int main() {
	long long n;
	scanf("%lld", &n);
	long long arr[n];
	for (long long i = 0; i < n; ++i) scanf("%lld", &arr[i]);

	quickSort(arr, 0, n - 1);
	printf("%lld\n", sumMax(arr, n));
	return 0;
}

三角形

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

void quickSort(int arr[], int left, int right) {
	if (left >= right) return;
	srand(time(NULL));
	int idx = rand() % (left - right) + left;
	int flag = arr[idx], head = left - 1, tail = right + 1;
	while (head < tail) {
		do head++; while(arr[head] < flag);
		do tail--; while(arr[tail] > flag);
		if (head < tail) {
			int tmp = arr[head];
			arr[head] = arr[tail];
			arr[tail] = tmp;
		}
	}
	quickSort(arr, left, tail);
	quickSort(arr, tail + 1, right);
}

void findTri(int arr[], int n) {
	for (int i = n - 1; i > 1; --i)
		if (arr[i] < arr[i - 1] + arr[i - 2]) {
			printf("%d %d %d\n", arr[i - 2], arr[i - 1], arr[i]);
			return;
		}
	printf("-1\n");
}

int main() {
	int n;
	scanf("%d", &n);
	int arr[n];
	for (int i = 0; i < n; ++i) scanf("%d", &arr[i]);

	quickSort(arr, 0, n - 1);
	findTri(arr, n);
	return 0;
}

子数组最大和

#include <stdio.h>
#include <string.h>

int maxSum(int arr[], int n) {
	int dp[n];
	memset(dp, 0, n * sizeof(int));
	int maxi = arr[0];
	dp[0] = arr[0];
	for (int i = 1; i < n; ++i) {
		dp[i] = arr[i] > (dp[i - 1] + arr[i]) ? arr[i] : (dp[i - 1] + arr[i]);
		maxi = dp[i] > maxi ? dp[i] : maxi;
	}
	return maxi;
}

int main() {
	int n;
	scanf("%d", &n);
	int arr[n];
	for (int i = 0; i < n; ++i) scanf("%d", &arr[i]);
	printf("%d\n", maxSum(arr, n));
	return 0;
}

和字符串

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

long long substrToNum(char str[], int pos, int len) {
	long long num = 0;
	for (int i = 0; i < len; ++i)
		num = num * 10 + str[pos + i] - '0';
	return num;
}

long long getLen(long long n) {
	int cnt = 0;
	do ++cnt, n /= 10; while(n);
	return cnt;
}

bool backTracking(char str[], int strLen, int begin, int len1, int len2) {
	if (begin + len1 + len2 >= strLen) return true;
	long long num1 = substrToNum(str, begin, len1);
	long long num2 = substrToNum(str, begin + len1, len2);
	long long num3 = substrToNum(str, begin + len1 + len2, getLen(num1 + num2));
	if (num1 + num2 == num3) return backTracking(str, strLen, begin + getLen(num1), getLen(num2), getLen(num3));
	return false;
}

void partition(char str[]) {
	int strLen = strlen(str);
	for (int i = 1; i <= strLen / 2; ++i) {
		if (backTracking (str, strLen, 0, i, i)) {
			printf("true\n");
			return;
		}
	}
	printf("false\n");
}

int main() {
	char str[1000] = "";
	scanf("%s", str);
	partition(str);
	return 0;
}

汤包

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

typedef struct {
	int guest;
	int end;
} Tag;

void quickSort(Tag* arr[], int left, int right) {
	if (left >= right) return;
	srand(time(NULL));
	int idx = rand() % (left - right) + left;
	int flag = arr[idx]->end, head = left - 1, tail = right + 1;
	while (head < tail) {
		do head++; while(arr[head]->end < flag);
		do tail--; while(arr[tail]->end > flag);
		if (head < tail) {
			Tag *tmp = arr[head];
			arr[head] = arr[tail];
			arr[tail] = tmp;
		}
	}
	quickSort(arr, left, tail);
	quickSort(arr, tail + 1, right);
}

void traverse(Tag *arr[], int n) {
	for (int i = 0; i < n; ++i)
		printf("%d ", arr[i]->guest);
}

int main() {
	int n;
	scanf("%d", &n);
	Tag *arr[n];
	for (int i = 0; i < n; ++i) {
		arr[i] = (Tag*)malloc(sizeof(Tag));
		arr[i]->guest = i + 1;
		int begin, duration;
		scanf("%d %d", &begin, &duration);
		arr[i]->end = begin + duration;
	}

	quickSort(arr, 0, n -1);
	traverse(arr, n);
	return 0;
}

打字机

#include <stdio.h>
#include <string.h>

long long dp[100];
long long seg[100] = {0};

long long method(char str[]) {
	memset(dp, -1, 100 * sizeof(long long));
	char *iter = str;
	int part = 0, ans = 1;
	seg[part] = 1;
	while (*iter) {
		if (*iter == 'm' || *iter == 'w') return 0;
		if (*iter == 'n' && *(iter + 1) == 'n') {
			int cnt = 1;
			dp[0] = 1, dp[1] = 2, iter += 2;
			while(*iter == 'n') {
				++cnt, ++iter;
				dp[cnt] = dp[cnt - 1] + dp[cnt - 2];
			}
			seg[++part] = dp[cnt];
		}
		else if (*iter == 'u' && *(iter + 1) == 'u') {
			int cnt = 1;
			dp[0] = 1, dp[1] = 2, iter += 2;
			while(*iter == 'u') {
				++cnt, ++iter;
				dp[cnt] = dp[cnt - 1] + dp[cnt - 2];
			}
			seg[++part] = dp[cnt];
		}
		else ++iter;
	}
	for (int i = 0; seg[i] ; ++i) ans *= seg[i];
	return ans;
}

int main() {
	char str[1000];
	scanf("%s", str);
	printf("%lld", method(str));
	return 0;
}

游乐园

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

int dist[12][12];
int n, m;
bool pass[12];
int ans = -1;

bool check(int v, int u) {
	return !pass[u] && dist[v][u] != 0x3f3f3f3f;
}

bool noway(int v) {
	for (int i = 0; i < n; ++i)
		if (check(v, i)) return false;
	return true;
}

void backTracking(int v, int l) {
	if (noway(v)) {
		ans = ans > l ? ans : l;
		return;
	}
	for (int i = 0; i < n; ++i) {
		if (check(v, i) && i != v) {
			pass[i] = true;
			backTracking(i, l + dist[v][i]);
			pass[i] = false;
		}
	}
}

int main() {
	scanf("%d %d", &n, &m);
	memset(dist, 0x3f, sizeof(dist));
	for (int i = 0; i < n; ++i) dist[i][i] = 0;
	while (m) {
		int v, u, l;
		scanf("%d %d %d", &v, &u, &l);
		v -= 1, u -= 1;
		dist[v][u] = dist[v][u] < l ? dist[v][u] : l;
		dist[u][v] = dist[v][u], --m;
	}

	for (int i = 0; i < n; ++i) {
		memset(pass, 0, sizeof(pass));
		pass[i] = true;
		backTracking(i, 0);
	}
	printf("%d\n", ans);
	return 0;
}

危险的组合(CPP)

感谢 Cubeist 提供的代码~

#include <iostream>
using namespace std;

long long w[] = {0, 0, 0, 1, 3, 8, 20, 47, 107, 238, 520, 1121,
2391, 5056, 10616, 22159, 46023, 95182, 196132, 402873, 825259,
1686408, 3438828, 6999071, 14221459, 28853662, 58462800,
118315137, 239186031, 483072832, 974791728};

int main()
{
    int n;
    while (cin >> n, n)
    {
        if (n <= 0) exit(0);
        cout << w[n] << endl;
    }
    return 0;
}

91-100 考试模拟

【循环】圆周率 $\pi$

#include <stdio.h>

double pi(int n) {
	double sum = 3.0f;
	for (int i = 2; i <= n; ++i) {
		double sgn = i % 2 ? -1.0f : 1.0;
		sum += sgn * 4 / (2 * i * (2 * i - 1) * (2 * i - 2));
	}
	return sum;
}

int main() {
	int n;
	scanf("%d", &n);
	printf("%.7lf\n", pi(n));
	return 0;
}

【选择】马赫数

#include <stdio.h>
#include <math.h>

void mach(double v, double T) {
	double m = (v / 3.6f) / (331.3f * sqrt(1 + T / 273.15f));
	printf("%.3lf ", m);
	if (m - 0.8f < 1e-6) printf("subsonic\n");
	else if (m - 1.2f < 1e-6) printf("transonic\n");
	else if (m - 5.0f < 1e-6) printf("supersonic\n");
	else printf("hypersonic\n");
}

int main() {
	double v, T;
	scanf("%lf %lf", &v, &T);
	mach(v, T);
	return 0;
}

【IO】气体扩散

#include <stdio.h>
#include <math.h>

double rate(double m1, double m2) {
	return sqrt(m2 / m1);
}

int main() {
	double m1, m2;
	scanf("%lf %lf", &m1, &m2);
	printf("%.4lf\n", rate(m1, m2));
	return 0;
}

【字符串】左右操作

#include <stdio.h>
#include <string.h>

void quickSort(char str[], int left, int right) {
	if (left >= right) return;
	char flag = str[(left + right) / 2];
	int head = left - 1, tail = right + 1;
	while (head < tail) {
		do head++; while (str[head] > flag);
		do tail--; while (str[tail] < flag);
		if (head < tail) {
			char tmp = str[head];
			str[head] = str[tail], str[tail] = tmp;
		}
	}
	quickSort(str, left, tail);
	quickSort(str, tail + 1, right);
}

void reverse(char str[], int begin, int end) {
	int head = begin, tail = end;
	while (head <= tail) {
		char tmp = str[head];
		str[head] = str[tail], str[tail] = tmp;
		++head, --tail;
	}
}

int main() {
	char str[1005] = "";
	scanf("%s", str);
	int len = strlen(str);
	quickSort(str, 0, len / 2 - 1);
	int mid = (len & 1) ? (len /2 + 1) : (len / 2);
	reverse(str, mid, len - 1);
	printf("%s", str);
	return 0;
}

【结构体】空中交通管制

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct {
	char id[64];
	int x;
	int y;
} Plane;

int main() {
	int n;
	scanf("%d", &n);
	Plane *plane[n];
	for (int i = 0; i < n; ++i) {
		plane[i] = (Plane *) malloc(sizeof(Plane));
		scanf("%s %d %d", plane[i]->id, &plane[i]->x, &plane[i]->y);
	}

	double minDist = 1e9;
	int idx1, idx2;
	for (int i = 0; i < n - 1; ++i) {
		for (int j = i + 1; j < n; ++j) {
			double dist = sqrt(pow(plane[i]->x - plane[j]->x, 2) +
				pow(plane[i]->y - plane[j]->y, 2));
			if (dist < minDist) idx1 = i, idx2 = j, minDist = dist;
		}
	}
	printf("%s-%s %.4lf", plane[idx1]->id, plane[idx2]->id, minDist);
	return 0;
}

/*
6
UA057 2 3
AA044 12 30
BA1534 40 50
DL262 5 1
AF001 12 10
SK837 3 4
*/

【数组】重复元素

#include <stdio.h>

int arr[1005] = {0};

int main() {
	int n, cnt = 0;
	scanf("%d", &n);
	for (int i = 0; i < n; ++i)	{
		scanf("%d", &arr[i]);
		for (int j = 0; j < i; ++j)
			if (arr[i] == arr[j]) {
				++cnt;
				break;
			}
	}
	printf("%d\n", cnt);
}

//10 1 10 20 1 25 1 10 30 25 1

【文件】平方根

#include <stdio.h>
#include <math.h>

int main() {
	int n;
	scanf("%d", &n);
	FILE *fp1 = fopen("rr.dat", "w");
	for (int i = 1; i <= n; ++i)
		fprintf(fp1, "%.6lf ", sqrt(i));
	fclose(fp1);

	FILE *fp2 = fopen("rr.dat", "r");
	for (int i = 1; i <= n; ++i) {
		double output;
		fscanf(fp2, "%lf", &output);
		printf("%.6lf ", output);
	}
	fclose(fp2);
	return 0;
}

 【算法】零钞

#include <stdio.h>

int main() {
	int s;
	scanf("%d", &s);

	int cnt[4], r = s;
	cnt[0] = r / 10, r -= cnt[0] * 10;
	cnt[1] = r / 5, r -= cnt[1] * 5;
	cnt[2] = r / 2, cnt[3] = r - cnt[2] * 2;

	if (cnt[3]) printf("1=%d\n", cnt[3]);
	if (cnt[2]) printf("2=%d\n", cnt[2]);
	if (cnt[1]) printf("5=%d\n", cnt[1]);
	if (cnt[0]) printf("10=%d\n", cnt[0]);
	return 0;
}

【枚举】机场翻牌显示

#include <stdio.h>
#include <ctype.h>

int cnt(char src, char dest) {
	if (src == dest) return 0;
	if (isupper(src))
		return (src < dest) ? (dest - src) : ('Z' - src + dest - 'A' + 1);
	if ('0' <= src && src <= '9') {
/*		if (src == '0') src = '9' + 1;
		if (dest == '0') dest = '9' + 1;
		return (src > dest) ? (src - dest) : (src - '0' + '9' + 1 - dest + 1);*/
		return (src < dest) ? (dest - src) : ('9' - src + dest - '0' + 1);
	}
	return -1;
}

int main() {
	char id1[10] = "", id2[10] = "";
	scanf("%s %s", id1, id2);
	int num = 0;
	for (int i = 0; id1[i] && id2[i] ; ++i) num += cnt(id1[i], id2[i]);
	printf("%d\n", num);
	return 0;
}

【递归】阿克曼数

#include <stdio.h>

int ack(int m, int n) {
	if (m == 0) return n + 1;
	if (n == 0) return ack(m - 1, 1);
	return ack(m - 1, ack(m, n -1));
}

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

西北工业大学NOJC程序设计习题答案(非本人制作,侵删) 1.“1“的传奇 2.A+B 3.A+BⅡ 4.AB 5.ACKERMAN 6.Arithmetic Progressions 7.Bee 8.Checksum algorithm 9.Coin Test 10.Dexter need help 11.Double 12.Easy problem 13.Favorite number 14.Graveyard 15.Hailstone 16.Hanoi Ⅱ 17.Houseboat 18.Music Composer 19.Redistribute wealth 20.Road trip 21.Scoring 22.Specialized Numbers 23.Sticks 24.Sum of Consecutive 25.Symmetric Sort 26.The Clock 27.The Ratio of gainers to losers 28.VOL大学乒乓球比赛 29.毕业设计论文打印 30.边沿与内芯的差 31.不会吧,又是A+B 32.不屈的小蜗 33.操场训练 34.插入链表节点 35.插入排序 36.插入字符 37.成绩表计算 38.成绩转换 39.出租车费 40.除法 41.创建与遍历职工链表 42.大数乘法 43.大数除法 44.大数加法 45.单词频次 46.迭代求根 47.多项式的猜想 48.二分查找 49.二分求根 50.发工资的日子 51.方差 52.分离单词 53.分数拆分 54.分数化小数 55.分数加减法 56.复数 57.高低交换 58.公园喷水器 59.韩信点兵 60.行程编码压缩算法 61.合并字符串 62.猴子分桃 63.火车站 64.获取指定二进制位 65.积分计算 66.级数和 67.计算A+B 68.计算PI 69.计算π 70.计算成绩 71.计算完全数 72.检测位图长宽 73.检查图像文件格式 74.奖金发放 75.阶乘合计 76.解不等式 77.精确幂乘 78.恐怖水母 79.快速排序 80.粒子裂变 81.链表动态增长或缩短 82.链表节点删除 83.两个整数之间所有的素数 84.路痴 85.冒泡排序 86.你会存钱吗 87.逆序整数 88.排列 89.排列分析 90.平均值函数 91.奇特的分数数列 92.求建筑高度 93.区间内素数 94.三点顺序 95.山迪的麻烦 96.删除字符 97.是该年的第几天 98.是该年的第几天? 99.数据加密 100.搜索字符 101.所有素数 102.探索合数世纪 103.特殊要求的字符串 104.特殊整数 105.完全数 106.王的对抗 107.危险的组合 108.文件比较 109.文章统计 110.五猴分桃 111.小型数据库 112.幸运儿 113.幸运数字”7“ 114.选择排序 115.寻找规律 116.循环移位 117.延伸的卡片 118.羊羊聚会 119.一维数组”赋值“ 120.一维数组”加法“ 121.勇闯天涯 122.右上角 123.右下角 124.圆及圆球等的相关计算 125.圆及圆球等相关计算 126.程序员添加行号 127.找出数字 128.找幸运数 129.找最大数 130.整数位数 131.重组字符串 132.子序列的和 133.子字符串替换 134.自然数立方的乐趣 135.字符串比较 136.字符串复制 137.字符串加密编码 138.字符串逆序 139.字符串排序 140.字符串替换 141.字符串左中右 142.组合数 143.最次方数 144.最大乘积 145.最大整数 146.最小整数 147.最长回文子串 148.左上角 149.左下角
评论 93
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值