蠻力法習題

1.分式化簡。設計算法,將一個給定的真分數化簡爲最簡分數形式。例如將6/8化簡爲3/4。

#include <iostream>
using namespace std;
int MinCommonFactor(int a,int b) //求最小公因數
{
    int i;
    for(i=2;i<=a&&i<=b;i++)
       if(a%i==0&&b%i==0)
          return i;
    return 1;
}
int main()
{
    int n,d;
    cin>>n>>d; //分別輸入一個真分數的分子和分母
    int n1=n,d1=d; 
    int min=MinCommonFactor(n1,d1);
    while(min>1)
    {
        n1/=min;
        d1/=min;
        min=MinCommonFactor(n1,d1);
    }
    cout<<"最簡真分數是"<<n1<<"/"<<d1<<endl; 
}

2.設計算法,判斷一個大整數能否被11整除。可以通過以下方法:將該數的十進制表示從右端開始,每兩位一組構成一個整數,然後將這些數相加,判斷其和能否被11整除。

#include <iostream>
using namespace std;
int main()
{
    char a[100];   //用字符數組來存儲一個長度可以達到100的十進制數 
    cin>>a;
    int temp(0);
    for(int i=0;a[i]!='\0';i++)
    {
        if(i%2==0)
           temp+=a[i]-'0';
        else
           temp+=10*(a[i]-'0');
    }
    if(temp%11==0) cout<<"該大整數能被11整除"<<endl;
    else cout<<"該大整數不能被11整除"<<endl;

    return 0;
}

3.數字遊戲。把數字1、2、……、9這9個數字填入以下加減乘除四則運算式中,使得該等式成立。要求9個數字僅出現1次,且數字1不能出現在乘和除的第一位中。
□□*□+□□□/□-□□=0
用整型數組a[1]~a[9]存儲1~9的全排列
??

4.設計算法求解a^n mod m,其中a、n和m均爲大於1的整數

#include <iostream>
using namespace std;
int Mod(int a,int n,int m)
{
    int aa=a;
    while(n>1)
    {
        aa *= a % m;
        n--;
    }
    return aa%m;
}
int main()
{
    int a,n,m;;
    cin>>a>>n>>m;
    cout<<a<<"^"<<n<<" mod "<<m<<"的值爲"<<Mod(a,n,m)<<endl;

    return 0;
}

5.設計算法,在數組r[n]中刪除所有元素值爲x的元素,要求時間複雜度爲O(n),空間複雜度爲O(1).

void f(int a[],n,x)
{
    for(int i=0;i<n;i++)
       {
         if(a[i]==x)
            {
               for(int j=i;j<n;j++)
                  a[j]=a[j+1];
            }
       }
}

6.設計算法,在數組r[n]中刪除重複的元素,要求移動元素的次數較少,並使剩餘元素間的相對次序保持不變。

void f(int a[],int n)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        if(a[i]==0) continue;
        for(j=i+1;j<n;j++)
        {
            if(a[j]==a[i])
               a[j]=0;
        }
    }
    for(i=0;i<n;i++)
    {
        if(a[i]!=0) continue;
        j=i+1;
        while(a[j]==0)
           j++;
        a[i]=a[j];
        a[j]=0;
    }   
}

7.設表A={a1,a2,……,an},將A拆成B和C兩個表,使A中值大於等於0的元素存入表B,值小於0的元素存入表C,要求表B和表C不另外設置存儲空間而利用表A的空間。

想法:對於線性表A,遍歷該表,對於當前值ai,如果ai>=0,則i++;
否則,將ai與初始值爲1的倒數第k個值互換,然後k++,繼續判斷ai;
直到i=n-k;
實現的話暫時沒有頭緒

8.荷蘭國旗問題。要求重新排列一個由字符R、W和B(R紅、W白、B藍)構成的數組,使得所有的R都排在最前面,W排在其次,B排在最後,爲荷蘭國旗問題設計一個算法,其時間複雜度爲O(n)。

#include <iostream>
using namespace std;
void swap(char &a,char &b)
{
    char temp;
    temp = a;
    a = b;
    b = temp;
}
void sort(char c[],int n)
{
    for(int i=0;i<n;i++)
    {
        if(c[i]=='R') continue;   //第i個前面已經完成排序
        else if(c[i]=='B')        //如果c[i]=B,就和後面最近的W換,保證B一定在W之後
        {
            int j=i+1;
            while(j<n)
            {
                if(c[j]=='W') {swap(c[i],c[j]);break;}
                j++;
            }           
        }       
        if(c[i]=='W')             //如果c[i]=W,就和後面最近的R換,後面無R則無操作
        {
            int j=i+1;
            while(j<n)
            {
                if(c[j]=='R') {swap(c[i],c[j]);break;}
                j++;
            }
        }

    } 
}
int main()
{
    char c[]={"RWWBWBRBRRWBRBW"};
    sort(c,strlen(c));
    cout<<c;
}

出自王紅梅 胡敏編著《算法設計與分析》習題3
未完繼續學習&&做題 17.3.8

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章