阅读量: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 考试模拟
【循环】圆周率
#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; }