P61,练习2解答<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
1,
#include<iostream>
usingnamespacestd;
//筛法求素数
voidFilterPrime(intn)

{
bool*isPrimes=newbool[n+1];
for(inti=2;i<=n;++i)

{
isPrimes[i]=true;
}
isPrimes[2]=true;
for(intj=2;j<=n;++j)

{
if(isPrimes[j]==true)

{
for(intm=2;j*m<=n;++m)

{
isPrimes[j*m]=false;
}
}
}
for(intk=2;k<=n;++k)

{
if(isPrimes[k]==true)

{
cout<<k<<"是素数"<<endl;
}
}
delete[]isPrimes;
}
intmain()

{
intnum;
cin>>num;
FilterPrime(num);
system("pause");
return0;
}
2,#include<iostream>
usingnamespacestd;
voidprocess(intnum)

{
doubleitem=1,sum=1;
intcount=1;
intsign=1;
while(abs(item)>1e-8)

{
item=item*num*sign/count;
sum+=item;
sign*=-1;
count++;
}
cout<<sum<<endl;
}
intmain()

{
intx;
cin>>x;
process(x);
system("pause");
return0;
}
3,
#include<iostream>
usingnamespacestd;

intmain()

{
__int64a[13];
a[1]=1;
for(inti=2;i<=12;++i)

{
a[i]=a[i-1]*i;
cout<<"a["<<i<<"]="<<a[i]<<endl;
}
__int64sum=0;
for(intj=1;j<=12;++j)

{
sum+=a[j];
}
cout<<sum<<endl;
system("pause");
return0;
}
4,
#include<iostream>
#include<cmath>
usingnamespacestd;
boolisNarcissusNum(intnum)

{//是否是水仙数
intsum=0,tmp,oldNum=num;
while(num!=0)

{
tmp=num%10;
sum+=tmp*tmp*tmp;
num=num/10;
}
if(sum==oldNum)
returntrue;
else
returnfalse;
}
boolisPerfectNum(intnum)

{//是否是完数
intsum=1;
for(inti=2;i<=num/2;++i)

{
if(num%i==0)

{
sum+=i;
}
}
if(sum==num)
returntrue;
else
returnfalse;
}
intmain()

{
for(inti=1;i<=1000;++i)

{
if(isPerfectNum(i))
cout<<i<<"是完数"<<endl;
}
system("pause");
return0;
}
5,
#include<iostream>
#include<cmath>
#include<deque>
#include<stack>
usingnamespacestd;
boolisPrimer(intnum)

{
for(inti=2;i<=sqrt(static_cast<double>(num));++i)

{
if(num%i==0)

{
returnfalse;
}
}
returntrue;
}
boolisPairNum(intnum)

{
deque<int>q;
stack<int>s;
intoldNum=num;
while(num!=0)

{
q.push_back(num%10);
s.push(num%10);
num/=10;
}
while(!s.empty()&&!q.empty())

{
if(s.top()!=q.front())

{
returnfalse;
}
else

{
s.pop();
q.pop_front();
}
}
returntrue;
}
intmain()

{
for(inti=100;i<=999;++i)

{
if(isPrimer(i)&&isPairNum(i))

{
cout<<"findanum:"<<i<<endl;
}
}
system("pause");
return0;
}
6,
#include<iostream>
usingnamespacestd;
intmain()

{
intpreNum=1,nextNum;
for(inti=9;i>=1;--i)

{
nextNum=(preNum+1)*2;
preNum=nextNum;
}
cout<<nextNum<<endl;
system("pause");
return0;
}
7,
#include<iostream>
usingnamespacestd;
intmain()

{
inti,j;
for(i=1;i<=10;++i)

{
for(j=1;j<=10-i;++j)
cout<<"";
for(j=1;j<=2*i-1;++j)
cout<<"%";
cout<<endl;
}
for(i=1;i<=9;++i)

{
for(j=1;j<=i;++j)
cout<<"";
for(j=1;j<=19-2*i;++j)
cout<<"%";
cout<<endl;
}
system("pause");
return0;
}
8,
#include<iostream>
usingnamespacestd;
intmain()

{
inti,j;
for(i=1;i<=10;++i)

{
for(j=1;j<=10-i;++j)
cout<<"";
for(j=1;j<=i;++j)
cout<<"#";
for(j=1;j<=6;++j)
cout<<"";
for(j=1;j<=i;++j)
cout<<"$";
cout<<endl;
}
system("pause");
return0;
}
9,
#include<iostream>
usingnamespacestd;
intmain()

{
inti,j;
for(i=1;i<=10;++i)

{
for(j=1;j<=i-1;++j)

{
cout<<"";
}
for(j=1;j<=21-2*i;++j)

{
if(j%2==0)//偶数位
cout<<"T";
else
cout<<"S";
}
cout<<endl;
}
system("pause");
return0;
}
10,母牛问题

时间(年)未成熟母牛(头)成熟母牛(头)母牛总数(头)
1 1 0 1
2 1 0 1
3 1 0 1
4 0 1 1
5 1 1 2
6 2 1 3
7 3 1 4
8 3 2 5
9 4 3 7
10 6 4 10
从图中可以看出A1=1,A2=2,A3=3,A4=4,A5=A4+A1等,则依此规律,An=An-1+An-4.这个规律很重要的,因为我们可以从中得到类似问题的规律(例如:从出生起第m个年头开始每年生一头母牛,则得到的规律是Fn=Fn-1+Fn-m (n>m)).
#include<iostream>
usingnamespacestd;
intcow(intn)

{//递归
if(n<=4)
return1;
else
returncow(n-1)+cow(n-4);
}
intcow2(intn)

{//非递归
inta1,a2,a3,a4;
a1=a2=a3=a4=1;
intresult=0;
if(n<=4)
return1;
else

{
for(inti=5;i<=n;++i)

{
result=a1+a4;
a1=a2;
a2=a3;
a3=a4;
a4=result;
}
returnresult;
}
}
intmain()

{
intn;
cin>>n;
cout<<"cowsare:"<<cow2(n)<<endl;
system("pause");
return0;
}
11,
#include<iostream>
usingnamespacestd;

doubleHeight(doublen,intlevel,double&bound)

{
if(level==1)

{
bound=n/2;
returnn;
}
else
returnn+n/2+Height(n/2,--level,bound);
}
intmain()

{
doubleheight=100.0,bound;
inttimes=10;
cout<<"第次落地时,经过距离:"<<Height(height,times,bound)<<endl;
cout<<"此时落地后反弹:"<<bound<<endl;
system("pause");
return0;
}

12,
#include<iostream>
usingnamespacestd;
intmain()

{
inti,j,k;
for(i=1;i<=9;++i)

{
for(j=1;j<=17;++j)

{
for(k=1;k<=85;++k)

{
if(10*i+5*j+k==100)

{
cout<<i<<"张10元,"<<j<<"张5元,"<<k<<"张1元"<<endl;
}
}
}
}
system("pause");
return0;
}
13,
#include<iostream>
usingnamespacestd;
intmain()

{
intdata[]=
{0,1,2,3,4,5,6};
inti,j,count;
for(i=1;i<=6;++i)

{
cout<<i<<'/t';
for(j=i-1,count=1;count<=7;++count)

{
if(j>=7)

{
j=j%7;
}
cout<<data[j]<<"";
j++;
if(count==7)
cout<<'/n';
}
}
system("pause");
return0;
}
#include<iostream>
usingnamespacestd;
intmain()

{
intdata[]=
{0,1,2,3,4,5,6};
inti,j,count;
for(i=1;i<=6;++i)

{
for(j=1;j<=7;++j)

{
cout<<"("<<i<<","<<j<<")"<<"";
if(j==7)
cout<<'/n'<<endl;
}
}
system("pause");
return0;
}
本文提供了一系列使用C++实现的经典算法练习题解答,包括素数筛选、级数计算、阶乘计算、水仙花数和完美数判断、回文质数查找、指数增长计算、图案打印等,有助于初学者理解并掌握基本的编程技巧。
471

被折叠的 条评论
为什么被折叠?



