思路
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;
}