蛮力法习题

1.分式化简。设计算法,将一个给定的真分数化简为最简分数形式。例如将6/8化简为3/4。

#include 
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<<"最简真分数是"<"/"<

2.设计算法,判断一个大整数能否被11整除。可以通过以下方法:将该数的十进制表示从右端开始,每两位一组构成一个整数,然后将这些数相加,判断其和能否被11整除。

#include 
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整除"<else cout<<"该大整数不能被11整除"<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 
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<"^"<" mod "<"的值为"<return 0;
}

5.设计算法,在数组r[n]中删除所有元素值为x的元素,要求时间复杂度为O(n),空间复杂度为O(1).

void f(int a[],n,x)
{
    for(int i=0;iif(a[i]==x)
            {
               for(int j=i;j1];
            }
       }
}

6.设计算法,在数组r[n]中删除重复的元素,要求移动元素的次数较少,并使剩余元素间的相对次序保持不变。

void f(int a[],int n)
{
    int i,j;
    for(i=0;i
    {
        if(a[i]==0) continue;
        for(j=i+1;j
        {
            if(a[j]==a[i])
               a[j]=0;
        }
    }
    for(i=0;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 
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;iif(c[i]=='R') continue;   //第i个前面已经完成排序
        else if(c[i]=='B')        //如果c[i]=B,就和后面最近的W换,保证B一定在W之后
        {
            int j=i+1;
            while(jif(c[j]=='W') {swap(c[i],c[j]);break;}
                j++;
            }           
        }       
        if(c[i]=='W')             //如果c[i]=W,就和后面最近的R换,后面无R则无操作
        {
            int j=i+1;
            while(jif(c[j]=='R') {swap(c[i],c[j]);break;}
                j++;
            }
        }

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

出自王红梅 胡敏编著《算法设计与分析》习题3
未完继续学习&&做题 17.3.8

你可能感兴趣的:(before)