C言語プログラミング筆記試験(2)


以前のブログで書かれたC言語プログラミングのテストの質問からの続き(1)

1つは、最小公倍数を見つける


タイトル説明:

  正の整数Aと正の整数Bの最小公倍数は、AとBで割り切れる最小の正の整数値を指します。入力AとBの最小公倍数を見つけるアルゴリズムを設計します。

説明を入力してください:

AとBの最小公倍数を出力します。

例:

入る:

5 7

出力:

35


思考ステップ


1.方法1


最小公倍数の問題を実行する前に、まず最大公約数を理解しましょう。

2つの数の最大公約数を見つける方法は?

ここに画像の説明を挿入

トスとターンを使用して、計算に分割できます。

投げて回して分割する:

ここに画像の説明を挿入
  さて、上の図の思考プロセスと百度百科の導入に基づいて、最大公約数を見つけるプロセスを理解することができます。

ここに画像の説明を挿入ここに画像の説明を挿入
アイデア:

1.最初に最大公約数qを見つけます

2.最小公倍数pを計算します


実装コード


#include <stdio.h>

int main()
{
    
    
	int a = 0;
	int b = 0;
	int c = 0;
	scanf("%d", &a);
	scanf("%d", &b);

	int m = a;
	int n = b;
	int tmp = 0;
	
   //a存放较大的值
	if (a < b)
	{
    
    
		tmp = a;
		a = b;
		b = tmp;
	}
	
	while (a%b != 0)
	{
    
    
		c = a%b;
		a = b;
		b = c;
	}
	
	if (a%b == 0)
	{
    
    
		c = b;
	}
	printf("%d\n",(m*n)/c);

	return 0;
}

2.方法2

  iは、i = aからi%a = 0 && i%b = 0まで、毎回1ずつ増加します。この時点で、iは最小公倍数です。

実装コード


#include <stdio.h>

int main()
{
    
    
	int a = 0;
	int b = 0;
	scanf_s("%d%d", &a, &b);
	int tmp = 0;

	//a存放较大的值
	if (a < b)
	{
    
    
		tmp = a;
		a = b;
		b = tmp;
	}

	int i = 0;
	for (i = a; i>0; i++)
	{
    
    
		if (i%a == 0 && i%b == 0)
		{
    
    
			break;
		}
	}
	printf("%d\n", i);
	return 0;
}


2.1匹の犬を探す


件名:

1匹の犬を探しています

タイトル説明

配列内の2つの数値のみが一度表示され、他のすべての数値は2回表示されます。

一度だけ現れるこれらの2つの数字を見つける関数を書いてください。


思考のステップ


1.1回だけ表示される2つの数字を見つけます

2.バイナリビットの法則に従って、これら2つの「シングルドッグ」をそれぞれ新しい配列に分割します。

3.ビット演算子の使用法に従って、2つのグループの2つのシングルドッグを見つけます

ここに画像の説明を挿入

実装コード

int main()
{
    
    
	int arr[] = {
    
     1, 2, 3, 4, 5, 6, 4, 3, 2, 1 };

	int sz = sizeof(arr) / sizeof(arr[0]);

	int i = 0;
	int num = 0;
	for (i = 0; i < sz; i++)
	{
    
    
		num ^= arr[i];
	}
	//我们得到了只出现了一次的两个数字的按位异或的结果。

	//根据异或的结果,我们得到这两个数字在二进制第几位开始不同


	//记录下异或结果中1第一次出现的位置pos,将原数组中的数字根据二进制第pos位是1/0进行分组。

	int pos = 0;

	for (i = 0; i < sz; i++)
	{
    
    
		if ((num >> i) == 1)

			pos = i;
	}

    //我们根据这一点,将这两个数字分在两个新的数组中

	
	int n1 = 0;

	int n2 = 0;
	
	//我们将二进制位中第pos位是0的数字分成新的一组

	for (i = 0; i < sz; i++)
	{
    
    
		if (((arr[i] >> pos) & 1) == 0)
			n1 ^= arr[i];  //新数组中的数字全部异或得到那个只出现一次的数字
	}

	//我们将二进制位中第pos位是1的数字分成新的一组

	for (i = 0; i < sz; i++)
	{
    
    
		if (((arr[i] >> pos) & 1) == 1)
			n2 ^= arr[i];  //新数组中的数字全部异或得到那个只出现一次的数字
	}

	printf("%d %d\n", n1, n2);
	
	return 0;
}


注意:C言語でのビット演算子の使用に注意してください!





今日のトピックはここで共有されます、あなたの感謝と注意に感謝します!





つづく...

おすすめ

転載: blog.csdn.net/rain67/article/details/115257197