-
冒泡排序
概念:重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
e.g
给定一个数组arr[]={1,2,3,4,5,6,7,8,9,10},编写一个函数将数组中的元素按降序进行排列
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0, j = 0;
for (i = 0; i < sz - 1; i++)//确定趟数
{
for (j = 0; j <sz-1-i ; j++)//确定元素的比较次数
{
int tmp = 0;
if (arr[j] < arr[j+1])
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
-
数组的中心索引
概念: 指数组中某个索引位置左边所有元素的和等于右边所有元素的和。换句话说,如果一个数组的中心索引是i,那么满足条件的就是数组中满足arr[0]+arr[1]+... +arr[i-1][i+l]+arr[i+2]+... +arr[n-1]的i的值。如果数组中不存在这样的中心索孔则返回-1。这个概念在解决些数组相关的问题时非常有用,比如找出数组中最大的平衡点,或者找出数组中的子数组,使得该子数组的元素的和等于数组中其他元素的和。
e.g
给你一个整数数组 nums ,请编写函数计算数组的中心下标 。
数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。如果数组有多个中心下标,应该返回最靠近左边的那一个。如果数组不存在中心下标,返回 -1 。
int pivotIndex(int* nums, int numsSize)
{
int nums[10001];
int total = 0;//数组中所有元素之和
int Lsum = 0;//中心坐标左侧数之和
int i = 0;
for (i = 0; i < numsSize; i++)
{
total += nums[i];
}
for (i = 0; i < numsSize; i++)
{
if (2 * Lsum + nums[i] == total)//左侧元素和==右侧元素和
{
return i;
}
else
{
Lsum += nums[i];
}
}
return -1;
}
-
完全数
概念:完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28
e.g
求输出n以内(含n)完全数的个数。
注意:本题输入含有多组样例。
输入描述:输入一个数字n
输出描述:输出不超过n的完全数的个数
#include <stdio.h>
int main()
{
int n=0;
while (scanf("%d", &n) != EOF)
{
int i=0;
int j=0;
int count=0;
for(i=2;i<=n;i++)
{
int sum=0;
for(j=1;j<i;j++)
{
if(i%j==0)
{
sum+=j;
}
}
if(sum==i)
{
count++;
}
}
printf("%d\n",count);
}
return 0;
}
-
最大公约数
概念:最大公约数,也称最大公因数、最大公因子,指两个或多个整数共有约数中最大的一个。
e.g
设计一个函数求两个数的最大公约数 。
//辗转相除法
int Gcd(int a, int b)
{
int c = a%b;
while (c)
{
a = b;
b = c;
c = a % b;
}
return b;//b即为最大公约数
}
-
最小公倍数
概念:两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。
e.g
输入两个整数,求它们的最小公倍数。
int main()
{
int a = 0, b = 0;
scanf("%d %d", &a, &b);
int m = a > b ? a : b;//找出最大值
while (m % a != 0 || m % b != 0)
{
m++;
}
printf("%d\n", m);
return 0;
}
-
自幂数
概念:自幂数是指一个n位数,每一位数字的n次幂的和正好等于这个数本身。
常见的自幂数有水仙花数:水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数
e.g
求出100~100000之间的所有自幂数。
#include <stdio.h>
#include<math.h>
int main()
{
int i = 0;
int count = 0;
for (i = 100; i <= 100000; i++)
{
int n = 1;
int tmp = i;
while (tmp/=10)//1.先求出是几位数
{
n++;
}
//2.在进行求和操作
tmp = i;
int sum = 0;
while (tmp)
{
sum += pow(tmp % 10, n);
tmp /= 10;
}
if (sum == i)
{
count++;
}
}
printf("%d\n", count);
return 0;
}