前言
代码已同步至 gitee:2023NOJ(C语言版)!
题目过于垃圾和睿智,做这种题简直是浪费生命,甚至会让代码水平剧烈下降,也就81-90题值得做一下,有这功夫不如多打会儿游戏。
贴出 100 题中全部 AC 代码,并不保证代码正确性、可读性、简洁性、最佳性,只能保证AC;目前 4 道题 WA,还有 5 道题使用 CPP。具体情况如下:
- 41-50:飞机起飞速度(WA);
- 51-60:字符串替换(WA);
- 61-70:GPS通信协议(CPP);
- 71-80:卫星定位(WA),日出日落时间(WA),火箭发射模拟(CPP),晶体结构(CPP),原子计数(CPP);
- 81-90:危险的组合(CPP)。
考试模板
作者考试时会携带的资料如下:
// 字符串操作函数(常用) // 为避免内存泄漏和野指针问题, 通常只能对开在栈上字符串使用, 而不能对开在堆上的字符串使用 # include // 失败时均返回NULL void *memset(void *str, int c, size_t n); // 复制字符c到str的前n个字符. // 使用memset对数组初始化时, 字符c只能为0或-1或0x3f. void *memcpy(void *dest, const void *src, size_t n); // 从src复制n个字符到dest, 一般不用于src和dest内存重叠的情况. void *memmove(void *dest, const void *src, size_t n); // 从src复制n个字符到dest, src和dest内存重叠时推荐使用. size_t strlen(const char *str); // 返回str长度, 即头指针到'\0'的距离(但不包含'\0'). char *strcat(char *dest, const char *src); // 将src追加到dest结尾. char *strchr(const char *str, int c); // 返回str中第一次出现字符c的位置. char *strstr(const char *haystack, const char *needle); // 返回在haystack中第一次出现needle的起始位置. size_t strspn(const char *str1, const char *str2); // str1中第一个不在str2出现的字符的下标 char *strtok(char *str, const char *delim); // 以delim为分隔, 分解str.
// 字符串操作函数(常用) // 为避免内存泄漏和野指针问题, 通常只能对开在栈上字符串使用, 而不能对开在堆上的字符串使用 # include // 失败时均返回NULL void *memset(void *str, int c, size_t n); // 复制字符c到str的前n个字符. // 使用memset对数组初始化时, 字符c只能为0或-1或0x3f. void *memcpy(void *dest, const void *src, size_t n); // 从src复制n个字符到dest, 一般不用于src和dest内存重叠的情况. void *memmove(void *dest, const void *src, size_t n); // 从src复制n个字符到dest, src和dest内存重叠时推荐使用. size_t strlen(const char *str); // 返回str长度, 即头指针到'\0'的距离(但不包含'\0'). char *strcat(char *dest, const char *src); // 将src追加到dest结尾. char *strchr(const char *str, int c); // 返回str中第一次出现字符c的位置. char *strstr(const char *haystack, const char *needle); // 返回在haystack中第一次出现needle的起始位置. size_t strspn(const char *str1, const char *str2); // str1中第一个不在str2出现的字符的下标 char *strtok(char *str, const char *delim); // 以delim为分隔, 分解str.
// 指针数组模板 #include #include typedef struct { char id[64]; int a; int b; } PointerArray; int main(){ int n; scanf("%d", &n); PointerArray *arr[n]; for (int i = 0; i id, &arr[i]->a, &arr[i]->b); } for (int i = 0; i id, arr[i]->a, arr[i]->b); return 0; }
// 二维数组模板 #include #include int** init(int n) { int** matrix = (int**)malloc(sizeof(int*) * (n + 1)); for(int i = 0; i arr[j + 1]) { // 若从大到小需修改本行 int tmp = arr[j]; arr[j] = arr[j + 1], arr[j + 1] = tmp, flag = true; } } if (!flag) break; } }
// 二分查找模板 long long left = 1, right = 1e19, mid, ans; while(left > 1) + left; if (isLeft(mid)) right = mid - 1, ans = mid; else left = mid + 1; }
// 文件读写模板 #include #include int main(){ int n; scanf("%d",&n); FILE *file = fopen("rr.dat", "w"); for(int i=1;i>1)+a; printf("%d",c); return 0; }
进制转换
#include int main(){ unsigned int a = 0; scanf("%d",&a); printf("%X,%o",a,a); }
浮点数输出
#include int main(){ double a = 0.0f; scanf("%lf",&a); printf("%.6lf,%.2lf,%.8lf",a,a,a); return 0; }
动态宽度输出
#include int main(){ int n = 0, m = 0, k = 0; scanf("%d %d",&n,&m); int tmp = n; while (tmp) { tmp /= 10; ++k; } for (int i = 0; i
计算地球上两点之间的距离
#include #include #define RADIUS 6371.000000 #define PI 3.1415926 int main(){ double phi1, phi2, lambda1, lambda2, distance; scanf("%lf %lf",&phi1,&lambda1); scanf("%lf %lf",&phi2,&lambda2); phi1 = phi1*PI/180; phi2 = phi2*PI/180; lambda1 = lambda1*PI/180; lambda2 = lambda2*PI/180; double havRatio = (1-cos(phi2-phi1))/2+cos(phi1)*cos(phi2)*(1-cos(lambda2-lambda1))/2; distance = asin(sqrt(havRatio))*2*RADIUS; printf("%.4lfkm",distance); return 0; }
风寒指数
#include #include int main(){ double v,T; scanf("%lf %lf",&v,&T); int chill = 13.12f+0.6215f*T-11.37f*pow(v,0.16f)+0.3965f*T*pow(v,0.16f)+0.5f; printf("%d",chill); return 0; }
颜色模型转换
#include #include #include double findmax(double a, double b, double c) { return a >= b ? (a >= c ? a : c) : (b >= c ? b : c); } double findmin(double a, double b, double c) { return a 0 ? B : 0) / 255.0f); max = findmax(r, g, b); min = findmin(r, g, b); V = max; if (max
11-20
乘数模
#include int main(){ long long a,b,m,r; scanf("%lld %lld %lld",&a,&b,&m); r = ((a%m)*(b%m))%m; printf("%lld",r); return 0; }
方阵
#include int main(){ int n,m; scanf("%d",&n); for (int i = 0; i 0 ? (i-j) : (j-i); printf("%d ",m); } printf("\n"); } return 0; }
分数的加、减、乘、除法
#include int gcd(int a,int b){ if (b == 0) return a; else return gcd(b,a%b); } int main(){ int aTop, aBot, bTop, bBot; scanf("%d",&aTop); getchar(); scanf("%d",&aBot); getchar(); scanf("%d",&bTop); getchar(); scanf("%d",&bBot); getchar(); int addTop, addBot, subTop, subBot, multTop, multBot, divTop, divBot; int addGcd, subGcd, multGcd, divGcd; addTop = aTop*bBot+aBot*bTop; addBot = aBot*bBot; addGcd = gcd(addTop,addBot); addTop /= addGcd; addBot /= addGcd; subTop = aTop*bBot-aBot*bTop; subBot = aBot*bBot; subGcd = gcd(subTop,subBot); subTop /= subGcd; subBot /= subGcd; multTop = aTop*bTop; multBot = aBot*bBot; multGcd = gcd(multTop,multBot); multTop /= multGcd; multBot /= multGcd; divTop = aTop*bBot; divBot = aBot*bTop; divGcd = gcd(divTop,divBot); divTop /= divGcd; divBot /= divGcd; printf("(%d/%d)+(%d/%d)=%d/%d\n",aTop,aBot,bTop,bBot,addTop,addBot); printf("(%d/%d)-(%d/%d)=%d/%d\n",aTop,aBot,bTop,bBot,subTop,subBot); printf("(%d/%d)*(%d/%d)=%d/%d\n",aTop,aBot,bTop,bBot,multTop,multBot); printf("(%d/%d)/(%d/%d)=%d/%d\n",aTop,aBot,bTop,bBot,divTop,divBot); return 0; }
操作数
#include int sumDig(int n){ int sum = 0; while(n){ sum += n%10; n /= 10; } return sum; } int main(){ int n,cnt=0; scanf("%d",&n); while(n){ n -= sumDig(n); ++cnt; } printf("%d",cnt); return 0; }
组合数
#include int main(){ int cnt = 0, n, m; scanf("%d",&n); for(int a = 0; a = 1; } return r; } int main(){ uint64 n, num; scanf("%llu",&n); num = power(4,n/2)*power(5,n-n/2)%mod; printf("%llu",num); return 0; }
毕达哥拉斯三元组
#include unsigned long long pythagoras(unsigned int sum){ // a as short catheti, b as long catheti, c as hypotenuse unsigned a,b,c; for (a = 1; a end > flag); if (head guest); } int main() { int n; scanf("%d", &n); Tag *arr[n]; for (int i = 0; i guest = i + 1; int begin, duration; scanf("%d %d", &begin, &duration); arr[i]->end = begin + duration; } quickSort(arr, 0, n -1); traverse(arr, n); return 0; }
打字机
#include #include long long dp[100]; long long seg[100] = {0}; long long method(char str[]) { memset(dp, -1, 100 * sizeof(long long)); char *iter = str; int part = 0, ans = 1; seg[part] = 1; while (*iter) { if (*iter == 'm' || *iter == 'w') return 0; if (*iter == 'n' && *(iter + 1) == 'n') { int cnt = 1; dp[0] = 1, dp[1] = 2, iter += 2; while(*iter == 'n') { ++cnt, ++iter; dp[cnt] = dp[cnt - 1] + dp[cnt - 2]; } seg[++part] = dp[cnt]; } else if (*iter == 'u' && *(iter + 1) == 'u') { int cnt = 1; dp[0] = 1, dp[1] = 2, iter += 2; while(*iter == 'u') { ++cnt, ++iter; dp[cnt] = dp[cnt - 1] + dp[cnt - 2]; } seg[++part] = dp[cnt]; } else ++iter; } for (int i = 0; seg[i] ; ++i) ans *= seg[i]; return ans; } int main() { char str[1000]; scanf("%s", str); printf("%lld", method(str)); return 0; }
游乐园
#include #include #include int dist[12][12]; int n, m; bool pass[12]; int ans = -1; bool check(int v, int u) { return !pass[u] && dist[v][u] != 0x3f3f3f3f; } bool noway(int v) { for (int i = 0; i l ? ans : l; return; } for (int i = 0; i
危险的组合(CPP)
感谢 Cubeist 提供的代码~
#include using namespace std; long long w[] = {0, 0, 0, 1, 3, 8, 20, 47, 107, 238, 520, 1121, 2391, 5056, 10616, 22159, 46023, 95182, 196132, 402873, 825259, 1686408, 3438828, 6999071, 14221459, 28853662, 58462800, 118315137, 239186031, 483072832, 974791728}; int main() { int n; while (cin >> n, n) { if (n y); } double minDist = 1e9; int idx1, idx2; for (int i = 0; i x - plane[j]->x, 2) + pow(plane[i]->y - plane[j]->y, 2)); if (dist id, plane[idx2]->id, minDist); return 0; } /* 6 UA057 2 3 AA044 12 30 BA1534 40 50 DL262 5 1 AF001 12 10 SK837 3 4 */
【数组】重复元素
#include int arr[1005] = {0}; int main() { int n, cnt = 0; scanf("%d", &n); for (int i = 0; i
【文件】平方根
#include #include int main() { int n; scanf("%d", &n); FILE *fp1 = fopen("rr.dat", "w"); for (int i = 1; i