交换两个值(不引入第三个变量)
现有两个值,要求不引入第三个变量的方法来交换两个数
思路:两个数相加之后再去减掉另一个值
实现方法:
#include<stdio.h>
//交换两个变量的值(不引入第三个变量)
int main()
{
int x = 10, y = 20;
printf("x=%d,y=%d\n", x, y);//交换之前的值
x = x + y; //x=30,y=20
y = x - y; //x=30,y=10
x = x - y; //x=20,y=10
printf("x=%d,y=%d", x, y);//交换之后的值
}
冒泡排序
现有三(可以任意多个,这里只列举三个)个数,要求从大到小排序并输出
思路:让每一个数和相邻的数去比较,将最大的放在第一位,然后再比较,次大的数放在第二位…
实现方法:
#include<stdio.h>
//三个数从大到小输出
int main()
{
int i, j, A;
int arr[] = { 23, 787, 126 };
for (j = 0; j <= 2; j++){ //外部循环,控制循环次数
for (i = 0; i <= 2; i++){ //内循环,控制相邻的去比较大小
if (arr[i] < arr[i + 1]){
A = arr[i]; //如果不满足,将两个数交换,将最大的放arr[0]
arr[i] = arr[i + 1];
arr[i + 1] = A;
}
}
}
for (i = 0; i <= 2; i++){ //循环输出
printf("%d ", arr[i]);
}
}
最大公约数
现有两个数,求这两个数的最大公约数
思路:先得到两个数,将大的数放在a中,小的放在b中,然后用一个for循环,令c=b,用a和b分别去除以c取余,每次都去c–,当a和b除c取余第一次同时为0的时候跳出for循环,输出c,c就是最大的公约数
实现方法:
#include<stdio.h>
//求两个数的最大公约数
int main()
{
int a, b, c;
printf("请输入两个数:");
scanf_s("%d%d", &a, &b);
if (a < b){
a = a + b; //大的值放在a中,小的值放在b中
b = a - b;
a = a - b;
}
for (c = b; c > 0; c--){ //for循环,重复进行取余操作
if ((a%c == 0) && (b%c == 0)){ //当第一次同时为0时,便是最大公约数,跳出循环
break;
}
}
printf("最大公约数是%d", c);
}
素数
求100——200之间的素数
思路:第一种是一种遍历的方法
#include<stdio.h>
//试除法
int main()
{
int i = 0;
int j = 0;
int count = 0;//计数
for(i = 100;i <= 200;i++)
{
for(j = 2;j < i;j++)
{
if(i % j == 0)
{
break;//跳出当前循环
}
}
if(j == i) //是素数
{
count++;
printf("%d\n",i);
}
}
printf("count == %d\n",count);
return 0;
}
第二种是只遍历一半之后的算法
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
int count = 0;//计数
for(i = 100;i <= 200;i++)
{
for(j = 2;j <= i/2;j++)
{
if(i % j == 0)
{
break;//跳出当前循环
}
}
if(j > i/2) //是素数
{
count++;
printf("%d\n",i);
}
}
printf("count == %d\n",count);
return 0;
}
第三种采用开根号的方法,在上一步遍历一半的基础上再简化
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
int count = 0;//计数
for(i = 101;i <= 200;i ++)// i = 5
{
for(j = 2;j <= sqrt((double)i);j++)// 2-4
{
if(i % j == 0)
{
break;//跳出当前循环
}
}
if(j > sqrt((double)i)) //是素数
{
count++;
printf("%d\n",i);
}
}
printf("count == %d\n",count);
return 0;
}
第四种是最终版,在开根号的基础上再进行简化,由于偶数肯定不是素数,所以在开根号的数中我们只需要对偶数进行遍历便可以得到最简化的算法
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
int count = 0;//计数
for(i = 101;i <= 200;i += 2)//这里只取偶数,每次i+2
{
for(j = 2;j <= sqrt((double)i);j++)
{
if(i % j == 0)
{
break;//跳出当前循环
}
}
if(j > sqrt((double)i)) //是素数
{
count++;
printf("%d\n",i);
}
}
printf("count == %d\n",count);
return 0;
}