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

avatar
作者
猴君
阅读量:2

前言

代码已同步至 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 <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; }

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!