
厦大ACM入门百练
基础入门100题
FFFade_
XMU.2021.
展开
-
试除法分解质因数
在试除法列出质因数的基础上改代码 结果越弄越复杂 一堆RA和WA优化版:枚举到 i 一定是质数(因为已经除干净了)质因数的分解结果无需保存枚举到 x/i 就可以了#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>int n, x;void divide(int x){ //从小到大枚举所有约数,不存在两个以上大于sqr.原创 2021-11-12 20:47:16 · 367 阅读 · 0 评论 -
试除法求约数
循环跳出的条件判断: x<=a/x (等号必须取 不然1没有输出)#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>int cmp(const void*a, const void*b){ return *(int*)a - *(int*) b;}int main(){ int n,a,b[1000],cnt=0; s.原创 2021-11-12 19:59:54 · 445 阅读 · 0 评论 -
质数环/素数环
#include <stdio.h>#include <math.h>#include <string.h>int a[18],used[18];isprime( int k ){ int i; for(i=2; i<=sqrt(k); i++) { if(k%i==0) break; } if(i>sqrt(k)) return 1; return 0;}void zsh( int cur, int n ){ a[0.原创 2021-11-12 19:27:51 · 449 阅读 · 0 评论 -
快速幂 大数简化运算
问题:输入三个数a k p, 请计算 a^k mod p的值。输入样例 155986 3509 62099321 8755 804314 9373 11004016 3748 89064860 3379 1172输出样例 13585418444600580小结论: (a + b) % p = (a % p + b % p) % p (1) (a - b) % p = (a % p - b % p ) % p (2) (a * b) %...原创 2021-11-12 16:19:43 · 176 阅读 · 0 评论 -
求八皇后的第n种解
思路 : 假设已经放好了k-1个皇后 现在放第k个#include <stdio.h>#include <math.h>#define N 8int s[93][N]; //全局变量 不用反复传参int buf[N]; //暂时存放数据,如果直接用二维数组存储的话代码不易阅读且易出错int q = 0; //第n-1个数据void equeen(int cur){ int i, j; if(c原创 2021-11-12 13:05:09 · 461 阅读 · 0 评论 -
递归求波兰表达式
Q1. 该如何读取字符串(类似于* + 11.0 12.0 + 24.0 35.0)?A1. 空格分段 可以用scanf一段一段地读取。Q2. 逆向扫描?A2. 递归 子问题:遇到一个运算符,将两个数字进行运算Q3. 递归结束条件?A3. 不再有输入的时候一些没想到的点:可以用switch( s[0] ) ... atof ( s ) 直接的return#include <stdio.h>#in...原创 2021-11-12 09:34:52 · 191 阅读 · 0 评论 -
N皇后问题
递归的关键是分解为子问题 上下级关系 与 结束条件#include <stdio.h>#include<math.h>void nqueen(int x, int n, int*a){ if(x==n) { for(int i=0; i<n; i++) printf("%d",a[i]); printf("\n"); } else{ int i; for( i=1; i<=n; i++) { int ok = 1; .原创 2021-11-11 23:56:36 · 105 阅读 · 0 评论 -
全排列的递归算法
非字典序:#include<stdio.h>void swap( int *a , int *b ){ int temp; temp = *a; *a = *b; *b = temp;}void pailie( int n, int*a, int cnt){ if(cnt==n){ for(int i=0; i<n; i++) { printf("%5d",a[i]); } printf("\n"); } else{ for(in原创 2021-11-10 14:31:21 · 279 阅读 · 0 评论 -
农夫与牛问题
有n个位置,c头牛,要把牛放在位置上,求最大的最小距离。思路:用二分法逼近最大的最小距离 成立则+,不成立则减#include <stdio.h> #include <string.h>#include <stdlib.h>#define N 100000int cmp( const void*a, const void*b ){ return *(int*)a - *(int*)b;}int check( int *x, int n, i.原创 2021-11-09 10:33:50 · 296 阅读 · 0 评论 -
拦截导弹(最长不上升子序列)
关键点 :记录至此数位置长度最长的数列 遍历 符合条件则+1;#include <stdio.h> #include <string.h>#include <stdlib.h>#define N 50000int main() { int k,height[N],d[N]; scanf("%d",&k); scanf("%d",&height[0]); for(int i=1; i<k; i++) { d原创 2021-11-09 09:40:33 · 104 阅读 · 0 评论 -
寻找最接近的元素
二分法易遗漏的点:边界问题 接近不能相同(重复数字)解决方法:从1开始输入 a[0]和a[n+1]向内赋同值 用l,r向外越过等于x的值#include <stdio.h> #include <math.h>#define N 1000000int min(int a, int b, int c){ if(!a) a = N; //不能输出相同的数 if(!b) b = N; if...原创 2021-11-09 09:09:52 · 139 阅读 · 0 评论 -
求两个矩形的重叠面积
巧妙:通过边的相对位置和大小进行计算#include<stdio.h>double max(double a, double b){ if(a>b) return a; return b; } double min(double a, double b){ if(a>b) return b; return a; } int main(){ double a,b,c,d,e,f,g,h; double s; while(原创 2021-11-08 22:16:07 · 3386 阅读 · 2 评论 -
同构字符串
题目:判断一个字符串能否映射到另一个字符串思路:统计两个字符串各个字母出现的次数,再将桶按大小排序,比较字母频次是否相等#include <stdio.h> #include <string.h>#include <stdlib.h>#define N 10000int cmp(const void*a, const void*b) //快排{ return *(int*)b - *(int*) a;}int main() { ch原创 2021-11-01 11:08:53 · 149 阅读 · 0 评论 -
求指定和的整数对
注意数组下标 别忘了i,j的重置还没过#include <stdio.h> #define N 100000int cmp(const void*a, const void*b){ return *(int*)a - *(int*)b;}int main() { int n,a[N],flag; long int m; scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d",&a[i])原创 2021-10-31 23:51:59 · 126 阅读 · 0 评论 -
二分法求方程的根
在循环的终止条件上卡住了。虽然oj上过了,但感觉这个代码还有问题。#include <stdio.h> double f(double x){ return x*x*x-5*x*x+10*x-80;}int main() { double x,i=5.0,j=6.0; while(j-i>1e-9) { x = (i+j)/2; if(f(x)>0) j=x; else i=x; } printf("%.9f",x);原创 2021-10-31 23:18:24 · 88 阅读 · 0 评论 -
贴瓷砖问题
递归思想当递归情况漏了的时候会出现program received signal sigsegv的报错描述新校区建设如火如荼,看着已经建好的墙,小栋需要算出一共有多少种贴瓷砖的方法,可以保证正方形的瓷砖被完全填充。然后从其中选出纹路最美的贴法。瓷砖是2x1的长方形:墙壁是3xn的大小这是3块砖的一种贴法可以按照此法填充整个墙壁。请问一共有几种方式可以用2x1的砖块平铺3xn墙面?输入一次输入可能包含多行,每一行分别给出不同的 n 值 (原创 2021-10-31 23:04:44 · 289 阅读 · 0 评论 -
求谦虚数(暴力枚举)
7060000时运行错误#include<stdio.h>int main(){ int n,qxs[2000],x,cnt=1,c,xh; scanf("%d",&n); qxs[1]=1; for(int i=2; i<7050000; i++) { x=i; while(x%5==0) x/=5; while(x%3==0) x/=3; while(x%7==0) x/=7; while(x%2==0) x/=2; if原创 2021-10-23 15:39:24 · 204 阅读 · 0 评论 -
计算N的阶乘(高精度乘法)
初始思路:1.不需要那么大的数组2.从1*到n,比从n*到1所需的时间更少3.对被乘数不必分离(不是大数)4.超时#include<stdio.h>int a[9000000],b[9000000],c[9000000]={0}; //不需要这么多位int main(){ int n,cnt1=0,cnt2=0,cnt3=0,m,x; while(scanf("%d",&n)!=EOF) { x =原创 2021-10-23 15:17:58 · 1293 阅读 · 0 评论 -
三数之和问题
注意数值重置初始化的位置需要一定的条理的逻辑顺序#include<stdio.h>int main(){ int n,target,a[10000]; int left,right; scanf("%d %d",&target,&n); for(int i=0; i<n; i++) { scanf("%d",&a[i]); } for(int i=0; i<.原创 2021-10-20 17:09:23 · 124 阅读 · 0 评论 -
找到最长回文字符串
下标与break#include<stdio.h>#include<string.h>int main(){ char s[1001]; int flag; gets(s); for(int i=strlen(s); i>-1; i--) //i表示长度 { int k=0; while( k+i-1 <strlen(s) ) //下标不超出 {//pr原创 2021-10-19 23:46:28 · 110 阅读 · 0 评论 -
057 点灯问题
<>双循环(超时)<>因子的奇偶判断<>平方数的数量描述初始时有 n 个灯泡关闭。 第 1 轮,打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。请统计出 n 轮后有多少个亮着的灯泡。#include<stdio.h>int main(){ int n,o原创 2021-10-18 19:37:55 · 209 阅读 · 0 评论 -
049 字符替换分段排序输出
1.最最重要的一定是先要好好审题,再大致列一下思路和框架2.函数atoi()可以将字符串转换为整数,并且忽略开头的0 头文件是stdlib.h 函数memset可以用来清空字符串 memset(a,0,sizeof(a));3.最后一段没有碰到‘5’没法录入可以一开始在字符串后面添加‘5’4.还有一个测试点没过#include<stdio.h>#include<string.h>#include<stdlib.h>int ...原创 2021-10-18 12:41:23 · 149 阅读 · 0 评论 -
043 分组求和求平均
繁琐且易错集中错在:初始值置零#include<stdio.h>#include<string.h>int main(){ int m,n,cnt=0; double a[101][101],gmsum[101],grsum[101]; while(scanf("%d %d",&n,&m)!=EOF) { cnt=0; for(int i=0;i<n; i++)原创 2021-10-17 19:59:10 · 177 阅读 · 0 评论 -
分类讨论求和最大
思路:把可能的和求出来比大小错误:条件运算符(?:)的运用(没有逗号)有R个红色盒子和B个黑色盒子,还有R个红色小球和B个黑子只能装一个小球,每个小球都要放 在一个盒子里。如果把一个红色小球放在一个红色盒子里,那么得分是C。如果把一个黑色小球放在一个黑色盒子里D。如果把一个 红色小球放在一个黑色盒子里,那么得分是E。如果把一个黑色小球放在一个红色盒子里,那么得分也是E。现在给出R,B,C,D,E。应该如何 放置这些小球进盒子,才能使得总得分最大?输出最大的总得分。输入一行,5个整数,分别原创 2021-10-17 13:48:42 · 150 阅读 · 0 评论