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

慈云数据 8个月前 (03-13) 技术支持 127 0

前言

代码已同步至 gitee:2023NOJ(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 
    // 失败时均返回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 
    // 失败时均返回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 
    #include 
    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 id, &arr[i]->a, &arr[i]->b);
        }
        for (int i = 0; i id, arr[i]->a, arr[i]->b);
        return 0;
    }
    // 二维数组模板
    #include 
    #include 
    int** init(int n) {
        int** matrix = (int**)malloc(sizeof(int*) * (n + 1));
        for(int i = 0; i  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 > 1) + left;
        if (isLeft(mid)) right = mid - 1, ans = mid;
        else left = mid + 1;
    }
    // 文件读写模板
    #include 
    #include 
    int main(){
        int n; scanf("%d",&n);
        FILE *file = fopen("rr.dat", "w");
        for(int i=1;i>1)+a;
        printf("%d",c);
        return 0;
    }

    进制转换

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

    浮点数输出

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

    动态宽度输出

    #include 
    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  
    

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

    #include 
    #include 
    #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 
    #include 
    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 
    #include 
    #include 
    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  0 ? B : 0) / 255.0f);
        max = findmax(r, g, b);
        min = findmin(r, g, b);
        V = max;
        if (max  
    

    11-20

    乘数模

    #include
    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
    int main(){
        int n,m;
        scanf("%d",&n);
        for (int i = 0; i  0 ? (i-j) : (j-i);
                printf("%d  ",m);
            }
            printf("\n");
        }
        return 0;
    }

    分数的加、减、乘、除法

    #include
    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
    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
    int main(){
        int cnt = 0, n, m;
        scanf("%d",&n);
        for(int a = 0; a = 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 
    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 end > flag);
    		if (head guest);
    }
    int main() {
    	int n;
    	scanf("%d", &n);
    	Tag *arr[n];
    	for (int i = 0; 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 
    #include 
    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 
    #include 
    #include 
    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  l ? ans : l;
    		return;
    	}
    	for (int i = 0; i  
    

    危险的组合(CPP)

    感谢 Cubeist 提供的代码~

    #include 
    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 y);
    	}
    	double minDist = 1e9;
    	int idx1, idx2;
    	for (int i = 0; i x - plane[j]->x, 2) +
    				pow(plane[i]->y - plane[j]->y, 2));
    			if (dist 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 
    int arr[1005] = {0};
    int main() {
    	int n, cnt = 0;
    	scanf("%d", &n);
    	for (int i = 0; i  
    

    【文件】平方根

    #include 
    #include 
    int main() {
    	int n;
    	scanf("%d", &n);
    	FILE *fp1 = fopen("rr.dat", "w");
    	for (int i = 1; i 
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon