Bilangan jabat tangan, setiap orang hanya berjabat tangan sekali

王林
Lepaskan: 2023-08-29 18:57:03
ke hadapan
667 orang telah melayarinya

Bilangan jabat tangan, setiap orang hanya berjabat tangan sekali

Andaikan anda berada di perhimpunan sosial. Jika anda hanya berjabat tangan sekali, bolehkah anda mengira berapa banyak jabat tangan yang anda boleh lakukan? Soalan ini mungkin menghiburkan anda. Masalah ini boleh diselesaikan dengan menggunakan kaedah matematik pilihatur dan gabungan. Walau bagaimanapun, operasi matematik boleh memakan masa.

Dalam artikel ini, kita akan membincangkan cara menyelesaikan masalah ini menggunakan C++. Kami akan meneroka pendekatan yang berbeza, termasuk formula matematik, rekursi dan teknik gabungan lain.

Senario input dan output

Andaikan anda mempunyai N bilangan orang dalam perhimpunan Anda ingin mengira bilangan jabat tangan yang mungkin supaya seseorang berjabat tangan sekali sahaja.

Input: N = 16
Output: 120
Input: N = 11
Output: 55
Salin selepas log masuk

Menggunakan Formula untuk Berjabat Tangan

Formula untuk mencari bilangan jabat tangan dalam perhimpunan N orang ialah −

No. of handshakes = N *(N-1) /2
Salin selepas log masuk

Setiap orang N akan berjabat tangan dengan (N-1) individu (tidak termasuk orang itu sendiri) dan jabat tangan antara dua individu tidak dikira dua kali.

Sebagai contoh, jika bilangan individu ialah 14. Maka, bilangan jabat tangan ialah

Handshakes = 14 * (14 - 1)/ 2
           = 14 * 13 / 2
           = 182/2
           = 91
Salin selepas log masuk

Contoh

Dalam contoh di bawah, kami menggunakan formula untuk mengira bilangan jabat tangan. Di sini kami hanya menggunakan pengendali matematik, mengambil sebagai input bilangan orang di parti.

#include <iostream>
using namespace std;

int count(int N) {
   // Formula: N * (N-1) / 2
   return (N * (N - 1)) / 2;
}

int main() {
   int totalIndividuals= 10;
   int numHandshakes = count(totalIndividuals);
   std::cout << "Number of handshakes: " << numHandshakes << std::endl;
   return 0;
}
Salin selepas log masuk

Output

Number of handshakes: 45
Salin selepas log masuk
Salin selepas log masuk

Gunakan gelung untuk

Di sini, kami mengira bilangan jabat tangan dengan mengulangi daripada 1 kepada ‘N-1’ dan menambah semua nilai.

Contoh

#include <iostream>
using namespace std;

int count(int N) {
   int numHandshakes = 0;

   for (int x = 1; x < N; x++) {
      numHandshakes += x;
   }

   return numHandshakes;
}

int main() {
   int totalIndividuals = 10;
   int numHandshakes = count(totalIndividuals);
   std::cout << "Number of handshakes: " << numHandshakes << std::endl;
   return 0;
}
Salin selepas log masuk

Output

Number of handshakes: 45
Salin selepas log masuk
Salin selepas log masuk

Gunakan rekursi

Kita boleh menggunakan rekursi untuk mengira bilangan jabat tangan Dengan berbuat demikian, kita membahagikan masalah kepada masalah yang lebih kecil dengan mempertimbangkan satu orang pada satu masa.

Contoh

#include <iostream>
using namespace std;

int count(int N) {
   if (N <= 1)
      return 0;
   return (N - 1) + count(N - 1);
}

int main() {
   int totalIndividuals = 20;
   int numHandshakes = count(totalIndividuals);
   std::cout << "Number of handshakes: " << numHandshakes << std::endl;
   return 0;
}
Salin selepas log masuk

Output

Number of handshakes: 190
Salin selepas log masuk

Gunakan While Loop

Di sini, kami telah menggunakan gelung sementara dengan kaunter penyusutan untuk mengira bilangan jabat tangan. Gelung bermula dengan jumlah bilangan orang dan kemudian mengurangkan pembilang satu demi satu selepas setiap lelaran.

Contoh

#include <iostream>
using namespace std;

int count(int N) {
   int numHandshakes = 0;

   while (N > 1) {
      numHandshakes += N - 1;
      N--;
   }

   return numHandshakes;
}

int main() {
   int totalIndividuals = 16;
   int numHandshakes = count(totalIndividuals);
   std::cout << "Number of handshakes: " << numHandshakes << std::endl;
   return 0;
}
Salin selepas log masuk

Output

Number of handshakes: 120
Salin selepas log masuk

Gunakan pengaturcaraan dinamik

Di sini, kami telah menggunakan pengaturcaraan dinamik untuk pengiraan

  • Inisialisasikan vektor ‘dp’ untuk menyimpan bilangan jabat tangan.

  • Lelaran dari 1 hingga N. Dalam setiap lelaran, ia mengisytiharkan bilangan jabat tangan sebagai jumlah jabat tangan sebelumnya dan bilangan individu tolak 1 sekarang.

Contoh

#include <iostream>
#include <vector>
using namespace std;

int count(int N) {
   std::vector<int> dp(N + 1);
   dp[0] = 0;

   for (int x = 1; x <= N; x++) {
      dp[x] = dp[x - 1] + (x - 1);
   }

   return dp[N];
}

int main() {
   int totalIndividuals = 21;
   int numHandshakes = count(totalIndividuals);
   std::cout << "Number of handshakes: " << numHandshakes << std::endl;
   return 0;
}
Salin selepas log masuk

Output

Number of handshakes: 210
Salin selepas log masuk

Nota Kaedah ini membantu mengelakkan pengiraan berlebihan. Di sini kami menyimpan nilai yang dikira sebelum ini dalam vektor "dp", yang boleh anda akses dan gunakan semula pada bila-bila masa. Ini menjadikan algoritma cekap dan mengurangkan masa pengiraan keseluruhan.

Kesimpulan

Kami telah membincangkan pelbagai cara untuk mengira bilangan jabat tangan yang perlu dilakukan oleh seseorang hanya sekali. Kaedah ini termasuk menggunakan operator matematik untuk pengiraan formula, menggunakan untuk gelung, rekursi, gelung sementara dan pengaturcaraan dinamik. Setiap kaedah ada kelebihannya. Pengaturcaraan dinamik ialah pendekatan yang lebih sistematik dan teratur untuk menyelesaikan masalah. Bergantung pada keperluan khusus anda, anda boleh menggunakan salah satu kaedah.

Atas ialah kandungan terperinci Bilangan jabat tangan, setiap orang hanya berjabat tangan sekali. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:tutorialspoint.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan