Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

จัดเรียงคำโดยไม่เปลี่ยนตำแหน่งสัมพัทธ์ของสระและพยัญชนะ ในภาษา C

กำหนดสตริงความยาว n (<10) หาจำนวนวิธีจัดเรียงใหม่ โดยที่ตำแหน่งของสระและพยัญชนะต้องคงที่ (สระอยู่เดิม พยัญชนะอยู่เดิม)

วิธีคำนวณ

  1. นับจำนวนสระ (v) และพยัญชนะ (c)
  2. หาจำนวนวิธีจัดเรียงสระ: v! / (freqแต่ละสระ!)
  3. หาจำนวนวิธีจัดเรียงพยัญชนะ: c! / (freqแต่ละพยัญชนะ!)
  4. คูณทั้งสองค่า

โค้ดตัวอย่าง (C++)

#include <iostream>
using namespace std;

long long fact(int n) {
    if (n <= 1) return 1;
    return n * fact(n-1);
}

long long countArrangements(string str) {
    long long freq[26] = {0};
    int v = 0, c = 0;
    for (char ch : str) {
        freq[ch-'a']++;
        if (ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='u') v++;
        else c++;
    }
    long long vow = fact(v);
    vow /= fact(freq[0]);  // a
    vow /= fact(freq[4]);  // e
    vow /= fact(freq[8]);  // i
    vow /= fact(freq[14]); // o
    vow /= fact(freq[20]); // u
    
    long long con = fact(c);
    for (int i=0;i<26;i++) 
        if (i!=0&&i!=4&&i!=8&&i!=14&&i!=20) con /= fact(freq[i]);
    
    return vow * con;
}

int main() {
    string str = "computer";
    cout << "Ways: " << countArrangements(str);
    return 0;
}

ผลลัพธ์

Ways: 720