2つの番号を交換する方法について

1. 2つの整数変数の値を指定して、2つの値の内容を交換します。

アイデア:コンピュータでは、2つの変数の内容を直接交換できる人間の脳のようなものではありませんが、中間変数を一時的に定義し、中間変数を使用して2つの変数の内容を交換できます。

//An highlighted blockvar foo = 'bar';
#include<stdio.h>
int main()
{
    
    
  int i=62, j=24, t=0;
  printf("%d  %d\n", i, j);
  t = j;
  j = i;
  i = t;
  printf("After change :%d  %d\n", i, j);
  system("pause");
  return 0;
}

成功した交換

2.一時変数を作成して2つの数値の内容を交換することはできません

1.アイデア:数学の特性を使用して交換できます。2つの数値の合計から一方の数値を引いたものが、もう一方の数値になります。

//An highlighted blocked foo = 'bar';
#include<stdio.h>
int main()
{
    
    
 int i = 62, j = 24;
 printf("%d  %d\n", i, j);
 i = i+j;
 j = i-j;
 i = i-j;
 printf("After change :%d  %d\n", i, j);
 system("pause");
 return 0;
}

欠点:さらに、減算すると、数値が大きすぎるとオーバーフローが発生します。つまり、aとbの値が制限されます。

2.思考スイッチ:バイナリの特徴によれば、iの値が^ jはiの値がjに割り当てられているので、jは= I ^ jは、元のI ^ J ^ Jと同等であるように、私に割り当てられ、
同じ原則として、次のステップでは、i = i ^ jは元のi ^ j ^ iと同等であるため、jの値がiに割り当てられます。このようにして、あまりにも多くの制限なしに値の交換も実現できます。

//An highlighted blocked foo = 'bar';
#include<stdio.h>
int main()
{
    
    
 int i = 62, j = 24;
 printf("%d  %d\n", i, j);
 i = i^j;
 j = i^j;
 i = i^j;
 printf("After change :%d  %d\n", i, j);
 system("pause");
 return 0;
}

しかし、実際のプログラミングでは、中間変数を使用する方が便利で迅速です。

3.配列Aの内容を配列Bの内容と交換します。(配列は同じサイズです)

アイデア:2つの配列aとbを作成し、配列に値を割り当て、ループを使用して配列の値をトラバースし、aとbの2つの値を上記の1を介して交換します。これはとても簡単です!
では、後者の関数確立関数を呼び出すのはもっと難しいのでしょうか?
最初にコードを見てください。

//An highlighted blockvar foo = 'bar';
#include 
void Swap1(int x, int y)
{
    
    
 int tmp = 0;
 tmp = x;
 x = y;
 y = tmp;
}
void Swap2(int *px, int *py)
{
    
    
 int tmp = 0;
 tmp = *px;
 *px = *py;
 *py = tmp;
}
int main()
{
    
    
 int num1 = 1;
 int num2 = 2;
 Swap1(num1, num2);
 printf("Swap1::num1 = %d num2 = %d\n", num1, num2);
 Swap2(&num1, &num2);
 printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
 return 0;
}

ここに画像の説明を挿入
明らかに、値を直接交換することはできません。配列の値を交換できるように、ポインタ、アドレス渡しのパススルーパラメータを使用する必要があります。

//An highlighted blockvar foo = 'bar';
#pragma warning(disable:4996)
#include<stdio.h>
int exch(int *arr1[10], int *arr2[10])
{
    
    
 int j;
 int t;
 for (j = 0; j < 10; j++)
 {
    
    
  t = arr1[j];
  arr1[j] = arr2[j];
  arr2[j] = t;
 }
}
int main()
{
    
    
 int a[10], b[10];
 int i;
 printf("please input a:\n");
 for (i = 0; i < 10; i++){
    
    
  scanf("%d", &a[i]);
 }
 printf("please input b:\n");
 for (i = 0; i < 10; i++) {
    
    
  scanf("%d", &b[i]);
 }
 exch(&a, &b);
 printf("after exchange a:");
 for (i = 0; i < 10; i++)
 {
    
    
  printf("%d\t", a[i]);
 }
 printf("\nafter exchange b:");
 for (i = 0; i < 10; i++)
 {
    
    
  printf("%d\t", b[i]);
 }
 system("pause");
 return 0;
}

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_40893595/article/details/90182086