实现两个数的交换

以下内容为本人学习笔记,若有错误,欢迎指正

今天看到一个有趣的题目
给定两个整形变量的值,将这两个值的内容进行交换
方法一:借助中间变量
#include <stdio.h>
int main()
{
     int num1 = 2, num2 = 5, temp = 0;
     printf("未交换之前:\n");
     printf("num1 = %d, num2 = %d\n", num1, num2);
     temp = num1;
     num1 = num2;
     num2 = temp;
     printf("交换之后:\n");
     printf("num1 = %d, num2 = %d\n", num1, num2);
     return 0;
}

方法二:将方法一包装成函数
#include <stdio.h>
void swap(int *x, int *y)
{
     int temp = 0;
     temp = *x;
     *x = *y;
     *y = temp;
}
int main()
{
     int num1 = 2, num2 = 5;
     printf("未交换之前:\n");
     printf("num1 = %d, num2 = %d\n", num1, num2);
     printf("交换之后:\n");
     swap(&num1, &num2);
     printf("num1 = %d, num2 = %d\n", num1, num2);
     return 0;
}


2,不允许创建临时变量,交换两个数的内容
方法一:利用两个数之间的和的结果保存两个数的结果
#include <stdio.h>
int main()
{
 int num1 = 3, num2 = 6;
 printf("未交换之前:\n");
 printf("num1 = %d, num2 = %d\n", num1, num2);
 printf("交换之后:\n");
 num1 = num1 - num2;//保存两个数差的关系,防止溢出
 num2 = num2 + num1;//若用乘除关系保存关系时,注意0
 num1 = num2 - num1;
 printf("num1 = %d, num2 = %d\n", num1, num2);
 return 0;
}


方法二 : 利用数字存储是按二进制序列存储
#include <stdio.h>
int main()
{
 int num1 = 3, num2 = 6;
 printf("未交换之前:\n");
 printf("num1 = %d, num2 = %d\n", num1, num2);
 printf("交换之后:\n");
 num1 = num1 ^ num2;//利用位运算,保存两数的关系
 num2 = num2 ^ num1;//两二进制数异或:相同为‘0’,不同为‘1’
 num1 = num2 ^ num1;
 printf("num1 = %d, num2 = %d\n", num1, num2);
 return 0;
}


3,求10个整数中的最大值

#include <stdio.h>
int main()
{
 int i = 0, max = 0, a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 for (i = 0; i < 10; i++)
 {
  printf("%3d", a[i]);
 }
 printf("\n");
 max = a[0];//若给定max=0,用max开始比较时若数组都为负数,则输出0,并非数组里面的最大值
 for (int j = 1; j < 10; j++)
 {//用打擂台的方法,逐一比较max和当前值,比较大的为新擂主
  if (max < a[j])
   max = a[j];
 }
 printf("其中最大的数是:%d\n", max);
 return 0;
}


4,将三个数按从大到小输出

方法一


#include <stdio.h>
int main()
{
     int i = 0, j = 0, temp, a[3] = { 3, 6, 12 };
     printf("未排序前:\n");
     for (i = 0; i < 3; i++)
     {
          printf("%3d", a[i]);
     }
     printf("\n");
     for (i = 0; i < 3; i++)
     {
          for (j = 1; j < 3; j++)
          {
               if (a[j]>a[j - 1])
               {
                    temp = a[j];
                    a[j] = a[j - 1];
                    a[j - 1] = temp;
               }
          }
     }
     printf("由大到小打印这3个数:\n");
     for (i = 0; i < 3; i++)
     {
          printf("%3d", a[i]);
     }
     return 0;
}

方法二:

#include <stdio.h>
void Swap(int *pa,int *pb)
{
     int temp = 0;
     temp = *pa;//*pa,解引用操作,找到pa所指空间的值
     *pa = *pb;
     *pb= temp;
}
int main()
{
     int i = 0, j = 0, a= 3,b= 6,c= 12 ;
     printf("未排序前:");
     printf("a=%d,b=%d,c=%d",a,b,c);
     printf("\n");
     if (a < b)//将a,b中较大的值保存在a中
     {
      Swap(&a, &b);
     }
     if (a < c)//实现将a,c中的较大值保存在a中
     {
          Swap(&a, &c);
     }
     if (b < c)//实现将b,c中较大值保存在b中
     {
          Swap(&b, &c);
     }
     printf("由大到小打印这3个数:\n");
     printf("a=%d, b=%d ,c=%d\n", a,b,c);
     return 0;
}

5,求两个数的最大公约数
方法一:相除法
#include <stdio.h>
int main()
{
     int a = 0, b = 0, c = 0, temp = 0;
     printf("请输入两个数");
     scanf("%d", &a);
     scanf("%d", &b);//不用判断大小,第一次循环时自动将值改变
     while (b%a != 0)
     {
      c = b%a;
      b = a;
      a = c;
     }
     printf("她们的最大公约数是%2d\n", a);
     return 0;
}

方法二:相减法
#include <stdio.h>
int main()
{
     int a = 18, b = 45, c = 0;
     while (a != b)
     {
      if (a < b)
      {
           c = b-a;
           b = c;
      }
      else
      {
           c = a - b;
           a = b;
           b = c;
      }
     }
     printf("她们的最大公约数是%2d\n", b);
     return 0;
}
完。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值