当前位置: 首页 > news >正文

算法常用思路总结

思路

  • 1. 求数组中最大最小值
    • 思路
    • 代码
  • 2. 计算阶乘
    • 思路:
    • 代码:
  • 3. 得到数字的每一位
    • 思路
    • 代码
  • 4. 计算时间类型
  • 5. 最大公约数、最小公倍数
  • 6. 循环数组的思想
    • 题目:猴子选大王
    • 代码
  • 补充
    • 经典例题
      • 1. 复试四则运算
        • 题目内容
        • 题解
      • 2. 数列求和
        • 题目内容
        • 题解

1. 求数组中最大最小值

思路

把数组中下标为0的值,先设置为最大(最小值),然后遍历数组,如果比它大(小)就更新。

代码

ElementType Max( ElementType S[], int N )
{ElementType maxNum=S[0];for(int i = 1;i<N;i++)if(maxNum<S[i])maxNum=S[i];return maxNum;
}

2. 计算阶乘

思路:

使用递归,把大问题分解为小问题

代码:

int Factorial(int n){if(n==0)return 1;return n*Factorial(n-1);
}

3. 得到数字的每一位

思路

通过不断的模以10,然后再除以10,不断循环,可以把得到每一位存放到数组里面(灵活处理)。

代码

// 一种表达
while(number){array[number%10]++;  //使用辅助数组记录每个位出现的次数number/=10;}// 存放每一位在数组中
while(number){array[i++]=number%10;  //使用辅助数组记录每位number/=10;}// 判断某一位出现了几次while(number){if(number%10==D)count++;number/=10;}

4. 计算时间类型

思路:可以统一转为分钟之后,统一处理。

time=hour*60+mintue

5. 最大公约数、最小公倍数

在这里插入图片描述

// 最大公约数
int gcd(int a,int b){if(b == 0)return a;return gcd(b,a%b);
}// 最小公倍数
int lcm(int a, int b) {return (a * b) / gcd(a, b);
}

6. 循环数组的思想

题目:猴子选大王

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>int main() {int i, N, arr[1000] = {0}, count=0;scanf("%d", &N);// 存入数组for (i = 0; i < N; i++)arr[i] = i+1;i = 0;while (1) {if (arr[(i + N) % N] != 0) {count++;}if (count % 3 == 0)arr[(i + N) % N] = 0;if (count == 3 * N-2) {printf("%d", arr[(i + N) % N]);break;}i++;}return 0;
}

补充

经典例题

1. 复试四则运算

题目内容

本题要求编写程序,计算2个复数的和、差、积、商。

输入格式:
输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1i和C2=a2+b2i的实部和虚部。题目保证C2不为0。

输出格式:
分别在4行中按照(a1+b1i) 运算符 (a2+b2i) = 结果的格式顺序输出2个复数的和、差、积、商,数字精确到小数点后1位。如果结果的实部或者虚部为0,则不输出。如果结果为0,则输出0.0。

题解
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>int main() {double a1, b1, a2, b2, a[4], b[4];char c[4] = { '+','-','*','/' };scanf("%lf %lf %lf %lf", &a1, &b1, &a2, &b2);a[0] = a1 + a2; b[0] = b1 + b2;a[1] = a1 - a2; b[1] = b1 - b2;a[2] = a1 * a2 - b1 * b2; b[2] = b1 * a2 + b2 * a1;a[3]= (a1 * a2 + b1 * b2) / (pow(a2, 2) + pow(b2, 2));b[3]= (b1 * a2 - a1 * b2) / (pow(a2, 2) + pow(b2, 2));for (int i = 0; i < 4; i++) {if (fabs(a[i]) > 0.05 && fabs(b[i]) > 0.05) {printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = %.1lf%+.1lfi", a1, b1,c[i], a2, b2, a[i], b[i]);}else if (fabs(b[i]) > 0.05) {printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = %.1lfi", a1, b1, c[i], a2, b2, b[i]);}else if (fabs(a[i]) > 0.05) {printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = %.1lf", a1, b1,c[i], a2, b2, a[i]);}else {printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = %.1lf", a1, b1, c[i],a2, b2, 0);}if(i!=3)printf("\n");}return 0;
}

2. 数列求和

题目内容

给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。

输入格式:
输入数字A与非负整数N。

输出格式:
输出其N项数列之和S的值。

题解
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<math.h>int main() {double sum = 0, item = 0;int A, N;scanf("%d %d",&A,&N);for (int i = 0; i < N; i++) {// 和之前的每一项计算不太一样item+= A * pow(10, i);sum += item;}printf("%.lf", sum);return 0;
}
http://www.lryc.cn/news/285030.html

相关文章:

  • Leetcode 3016. Minimum Number of Pushes to Type Word II
  • node.js如何将webp转jpg图片
  • 达梦数据库 忘记 SYSDBA 密码 处理方法
  • SpringBoot ES 重建 Mapping
  • 【51单片机】矩阵按键
  • Redis- AOF刷盘策略
  • 标量、向量、矩阵和张量的区别?
  • 【51单片机】动态数码管
  • Webpack5入门到原理22:提升打包构建速度
  • EXCEL VBA获取幸运数字号码
  • 【标准IO】fseek函数、ftell函数、fflush函数、getline函数
  • VSCODE使用CMAKE显示命令无法找到
  • 【SpringCloud】微服务框架后端部署详细过程记录20240119
  • 《设计模式的艺术》笔记 - 桥接模式
  • Redis高并发分布式锁
  • 组件开发遇到的问题(vue的问题)
  • vue3前端开发,感受一下组合式api和VUE2选项式的差异
  • 电梯调度问题文献阅读
  • 文心一言 VS 讯飞星火 VS chatgpt (183)-- 算法导论13.4 7题
  • ChatGLM vs ChatGPT
  • leetcode热题100.三数之和
  • GitLab服务器忘记root密码处理方式
  • js-cookie的使用--token的数据实现持久化
  • 【实战】SpringBoot自定义 starter及使用
  • 网络爬虫采集工具
  • 【协议】XMLHttpRequest的梳理和总结
  • AI教我学编程之C#类的基本概念(1)
  • 前端js 数据结构:对象 object、数组Array 、Map 的创建、增删改 / 遍历数据
  • ARM_Linux的NFS网络文件系统的搭建
  • vscode配置web开发环境(WampServer)