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