C++ Exercises(十三)

本文提供了一系列使用C++实现的经典算法练习题解答,包括素数筛选、级数计算、阶乘计算、水仙花数和完美数判断、回文质数查找、指数增长计算、图案打印等,有助于初学者理解并掌握基本的编程技巧。

P61,练习2解答<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


None.gif1
None.gif#include
<iostream>
None.gif
usingnamespacestd;
None.gif
None.gif
//筛法求素数
None.gif
voidFilterPrime(intn)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
bool*isPrimes=newbool[n+1];
InBlock.gif
for(inti=2;i<=n;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifisPrimes[i]
=true;
ExpandedSubBlockEnd.gif}

InBlock.gifisPrimes[
2]=true;
InBlock.gif
for(intj=2;j<=n;++j)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(isPrimes[j]==true)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
for(intm=2;j*m<=n;++m)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifisPrimes[j
*m]=false;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gif
for(intk=2;k<=n;++k)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(isPrimes[k]==true)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifcout
<<k<<"是素数"<<endl;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gifdelete[]isPrimes;
ExpandedBlockEnd.gif}

None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
intnum;
InBlock.gifcin
>>num;
InBlock.gifFilterPrime(num);
InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif

None.gif2,#include<iostream>
None.gif
usingnamespacestd;
None.gif
None.gif
voidprocess(intnum)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
doubleitem=1,sum=1;
InBlock.gif
intcount=1;
InBlock.gif
intsign=1;
InBlock.gif
while(abs(item)>1e-8)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifitem
=item*num*sign/count;
InBlock.gifsum
+=item;
InBlock.gifsign
*=-1;
InBlock.gifcount
++;
ExpandedSubBlockEnd.gif}

InBlock.gifcout
<<sum<<endl;
ExpandedBlockEnd.gif}

None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
intx;
InBlock.gifcin
>>x;
InBlock.gifprocess(x);
InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif

None.gif3
None.gif#include
<iostream>
None.gif
usingnamespacestd;
None.gif
None.gif
None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif__int64a[
13];
InBlock.gifa[
1]=1;
InBlock.gif
for(inti=2;i<=12;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifa[i]
=a[i-1]*i;
InBlock.gifcout
<<"a["<<i<<"]="<<a[i]<<endl;
ExpandedSubBlockEnd.gif}

InBlock.gif__int64sum
=0;
InBlock.gif
for(intj=1;j<=12;++j)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifsum
+=a[j];
ExpandedSubBlockEnd.gif}

InBlock.gifcout
<<sum<<endl;
InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif

None.gif4
None.gif#include
<iostream>
None.gif#include
<cmath>
None.gif
usingnamespacestd;
None.gif
None.gif
boolisNarcissusNum(intnum)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{//是否是水仙数
InBlock.gif
intsum=0,tmp,oldNum=num;
InBlock.gif
while(num!=0)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.giftmp
=num%10;
InBlock.gifsum
+=tmp*tmp*tmp;
InBlock.gifnum
=num/10;
ExpandedSubBlockEnd.gif}

InBlock.gif
if(sum==oldNum)
InBlock.gif
returntrue;
InBlock.gif
else
InBlock.gif
returnfalse;
ExpandedBlockEnd.gif}

None.gif
boolisPerfectNum(intnum)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{//是否是完数
InBlock.gif
intsum=1;
InBlock.gif
for(inti=2;i<=num/2;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(num%i==0)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifsum
+=i;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gif
if(sum==num)
InBlock.gif
returntrue;
InBlock.gif
else
InBlock.gif
returnfalse;
ExpandedBlockEnd.gif}

None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
for(inti=1;i<=1000;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(isPerfectNum(i))
InBlock.gifcout
<<i<<"是完数"<<endl;
ExpandedSubBlockEnd.gif}

InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif

None.gif5
None.gif#include
<iostream>
None.gif#include
<cmath>
None.gif#include
<deque>
None.gif#include
<stack>
None.gif
usingnamespacestd;
None.gif
None.gif
boolisPrimer(intnum)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
for(inti=2;i<=sqrt(static_cast<double>(num));++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(num%i==0)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
returnfalse;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gif
returntrue;
ExpandedBlockEnd.gif}

None.gif
None.gif
boolisPairNum(intnum)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifdeque
<int>q;
InBlock.gifstack
<int>s;
InBlock.gif
intoldNum=num;
InBlock.gif
while(num!=0)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifq.push_back(num
%10);
InBlock.gifs.push(num
%10);
InBlock.gifnum
/=10;
ExpandedSubBlockEnd.gif}

InBlock.gif
while(!s.empty()&&!q.empty())
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(s.top()!=q.front())
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
returnfalse;
ExpandedSubBlockEnd.gif}

InBlock.gif
else
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifs.pop();
InBlock.gifq.pop_front();
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gif
returntrue;
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
for(inti=100;i<=999;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(isPrimer(i)&&isPairNum(i))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifcout
<<"findanum:"<<i<<endl;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif

None.gif6
None.gif#include
<iostream>
None.gif
usingnamespacestd;
None.gif
None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
intpreNum=1,nextNum;
InBlock.gif
for(inti=9;i>=1;--i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifnextNum
=(preNum+1)*2;
InBlock.gifpreNum
=nextNum;
ExpandedSubBlockEnd.gif}

InBlock.gifcout
<<nextNum<<endl;
InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif

None.gif7
None.gif#include
<iostream>
None.gif
usingnamespacestd;
None.gif
None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
inti,j;
InBlock.gif
for(i=1;i<=10;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
for(j=1;j<=10-i;++j)
InBlock.gifcout
<<"";
InBlock.gif
for(j=1;j<=2*i-1;++j)
InBlock.gifcout
<<"%";
InBlock.gifcout
<<endl;
ExpandedSubBlockEnd.gif}

InBlock.gif
for(i=1;i<=9;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
for(j=1;j<=i;++j)
InBlock.gifcout
<<"";
InBlock.gif
for(j=1;j<=19-2*i;++j)
InBlock.gifcout
<<"%";
InBlock.gifcout
<<endl;
ExpandedSubBlockEnd.gif}

InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif

None.gif8
None.gif#include
<iostream>
None.gif
usingnamespacestd;
None.gif
None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
inti,j;
InBlock.gif
for(i=1;i<=10;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
for(j=1;j<=10-i;++j)
InBlock.gifcout
<<"";
InBlock.gif
for(j=1;j<=i;++j)
InBlock.gifcout
<<"#";
InBlock.gif
for(j=1;j<=6;++j)
InBlock.gifcout
<<"";
InBlock.gif
for(j=1;j<=i;++j)
InBlock.gifcout
<<"$";
InBlock.gifcout
<<endl;
ExpandedSubBlockEnd.gif}

InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif

None.gif9
None.gif#include
<iostream>
None.gif
usingnamespacestd;
None.gif
None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
inti,j;
InBlock.gif
for(i=1;i<=10;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
for(j=1;j<=i-1;++j)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifcout
<<"";
ExpandedSubBlockEnd.gif}

InBlock.gif
for(j=1;j<=21-2*i;++j)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(j%2==0)//偶数位
InBlock.gif
cout<<"T";
InBlock.gif
else
InBlock.gifcout
<<"S";
ExpandedSubBlockEnd.gif}

InBlock.gifcout
<<endl;
ExpandedSubBlockEnd.gif}

InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif

10,母牛问题

None.gif
None.gif时间
()未成熟母牛()成熟母牛()母牛总数()
None.gif
1  1 0  1
None.gif
2  1     0  1
None.gif
3  1     0  1
None.gif
4  0     1  1
None.gif
5  1     1  2
None.gif
6  2     1  3
None.gif
7  3     1  4
None.gif
8  3     2  5
None.gif
9  4     3  7
None.gif
10  6     4  10
None.gif

从图中可以看出A1=1A2=2A3=3A4=4A5=A4+A1等,则依此规律,An=An-1+An-4.这个规律很重要的,因为我们可以从中得到类似问题的规律(例如:从出生起第m个年头开始每年生一头母牛,则得到的规律是FnFn-1+Fn-m (nm)).

None.gif#include<iostream>
None.gif
usingnamespacestd;
None.gif
None.gif
intcow(intn)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{//递归
InBlock.gif
if(n<=4)
InBlock.gif
return1;
InBlock.gif
else
InBlock.gif
returncow(n-1)+cow(n-4);
ExpandedBlockEnd.gif}

None.gif
intcow2(intn)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{//非递归
InBlock.gif
inta1,a2,a3,a4;
InBlock.gifa1
=a2=a3=a4=1;
InBlock.gif
intresult=0;
InBlock.gif
if(n<=4)
InBlock.gif
return1;
InBlock.gif
else
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
for(inti=5;i<=n;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifresult
=a1+a4;
InBlock.gifa1
=a2;
InBlock.gifa2
=a3;
InBlock.gifa3
=a4;
InBlock.gifa4
=result;
ExpandedSubBlockEnd.gif}

InBlock.gif
returnresult;
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
intn;
InBlock.gifcin
>>n;
InBlock.gifcout
<<"cowsare:"<<cow2(n)<<endl;
InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif

None.gif11
None.gif#include
<iostream>
None.gif
usingnamespacestd;
None.gif
None.gif
None.gif
doubleHeight(doublen,intlevel,double&bound)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
if(level==1)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifbound
=n/2;
InBlock.gif
returnn;
ExpandedSubBlockEnd.gif}

InBlock.gif
else
InBlock.gif
returnn+n/2+Height(n/2,--level,bound);
ExpandedBlockEnd.gif}

None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
doubleheight=100.0,bound;
InBlock.gif
inttimes=10;
InBlock.gifcout
<<"第次落地时,经过距离:"<<Height(height,times,bound)<<endl;
InBlock.gifcout
<<"此时落地后反弹:"<<bound<<endl;
InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif

None.gif
None.gif
12
None.gif#include
<iostream>
None.gif
usingnamespacestd;
None.gif
None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
inti,j,k;
InBlock.gif
for(i=1;i<=9;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
for(j=1;j<=17;++j)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
for(k=1;k<=85;++k)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(10*i+5*j+k==100)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifcout
<<i<<"张10元,"<<j<<"张5元,"<<k<<"张1元"<<endl;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif

None.gif13
None.gif#include
<iostream>
None.gif
usingnamespacestd;
None.gif
None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif
intdata[]=dot.gif{0,1,2,3,4,5,6};
InBlock.gif
inti,j,count;
InBlock.gif
for(i=1;i<=6;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifcout
<<i<<'/t';
InBlock.gif
for(j=i-1,count=1;count<=7;++count)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
InBlock.gif
if(j>=7)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifj
=j%7;
ExpandedSubBlockEnd.gif}

InBlock.gifcout
<<data[j]<<"";
InBlock.gifj
++;
InBlock.gif
if(count==7)
InBlock.gifcout
<<'/n';
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif
None.gif#include
<iostream>
None.gif
usingnamespacestd;
None.gif
None.gif
intmain()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif
intdata[]=dot.gif{0,1,2,3,4,5,6};
InBlock.gif
inti,j,count;
InBlock.gif
for(i=1;i<=6;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
for(j=1;j<=7;++j)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifcout
<<"("<<i<<","<<j<<")"<<"";
InBlock.gif
if(j==7)
InBlock.gifcout
<<'/n'<<endl;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值