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