7 常见算法题
约 1007 字大约 3 分钟
2025-06-18
打印菱形
int a=6;
//scanf("%d",&a);
for (int i = 0; i <= a; i++) {
for (int j = 0; j < a-i; j++) {
printf(" ");
}
for (int j = 0; j < 2*i+1; j++) {
printf("*");
}
printf("\n");
}
for (int i = 0; i <= a; i++) {
for (int j = 0; j < i+1; j++) {
printf(" ");
}
for (int j = 0; j < 2*a-(2*i+1); j++) {
printf("*");
}
printf("\n");
}
判断素数
判断素数只需要判断到这个数的一半或它的平方根即可
int suuu(int num){
for (int i = 2; i < num/2+1; i++) {
if(num%i==0){ return 0;}
}
return 1;
}
分解质因数
其中num每次辗转相除都会变小,除到最后变为1即跳出for循环程序结束。
void viybuu(int num){
for (int i = 2; i <= num; i++) {
while (num%i==0){
printf("%d ",i);
num/=i;
}
}
}
判断分数
如果分数大于等于90为a等级,大于等于60小于90为b等级,小于60为c等级,使用比较运算符
int score;
scanf("%d", &score);
char str;
str = score >= 90 ? 'A' : 60 <= score && score < 90 ? 'B' : 'C';
return 0;
其中60<=score && score<90不能连写为60<=score<90
c语言中不支持不等式的连写 上述判断实际执行顺序为先判断(60<=score)返回结果为0或1,再将结果(0或1)与90进行比较
求两个数的最大公约数和最小公倍数
欧几里得算法
假如需要求 1997 和 615 两个正整数的最大公约数,过程: b:1997 ÷ a:615 = 3 (余 r:152) a:615 ÷ r:152 = 4(余r:7) 152 ÷ 7 = 21(余5) 7 ÷ 5 = 1 (余2) 5 ÷ 2 = 2 (余1) 2 ÷ 1 = 2 (余0) 至此,最大公约数为1 以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。
void gsytuugsbwuu(int a,int b){
if(a>b){
int c=a;
a=b;
b=c;
}
int r=b%a;
int c=a*b;//算最小公倍数
while (r){
b=a;
a=r;
r=b%a;
}
printf("最大公约数为:%d,最小公倍数为:%d",a,c/a);
}
杨辉三角形
int a[10][10]={};
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
printf("%4d",a[i][j]);
}
printf("\n");
}
printf("----------------------------------------\n");
for (int i = 0; i < 10; i++) {
for (int j = 0; j <= i; j++) {
if(j==0 || i==j){
a[i][j]=1;
} else{
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
}
for (int i = 0; i < 10; i++) {
for (int j = 0; j <= i; j++) {
printf("%4d",a[i][j]);
}
printf("\n");
}
printf("----------------------------------------\n");
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
printf("%4d",a[i][j]);
}
printf("\n");
}
约瑟夫环
void ytsefu(int n) {
int array[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int m=n;
int count = 1;
while (n){
for (int i = 0; i < m; i++) {
if(array[i]==0){
continue;
}
if(count%3==0){
printf("%d\n",array[i]);
array[i]=0;
n--;
}
count++;
}
}
}
用指针
void ytsefu(int n) {
int array[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int m=n;
int count = 1;
int *p=array;
while (n){
while (p!=&array[m]){
if(*p==0){
p++;
continue;
}
if(count%3==0){
printf("%d",*p);
*p=0;
n--;
}
p++;
count++;
}
p=array;
}
}
双指针
- 普通双指针:两个指针向同一个方向移动
- 对撞双指针:两个指针对向移动
- 快慢双指针:慢指针+快指针
滑动窗口
在求一个数组从k开始定长字串的大小的情况下适用滑动窗口
摩尔投票法
对于要求一个数组中的多数元素(即在此数组中出现次数超过数组元素一般的数)时,如粒扣子169题就适用摩尔投票法.
首先记录一个元素,遍历每出现一个该元素计数器就加一,如果出现的不是该元素就减一,当计数减到0且下一个元素不是该元素时就切换为下一个元素,直到遍历完整个数组还在记录中的元素就是多数元素
贪心算法
贪心算法就是在每一步做出当前最优选择(在整体来看可能并不是最优选择,但在每一步都是当时的最优选择)
贡献者
版权所有
版权归属:PinkDopeyBug