C++学习四(习题演练)

C++的一些题目代码记录

题一

题目: 请输出大于2018的10个素数。
分析: 这里重点是对素数的判断。

#include<iostream>
#include<cmath>
using namespace std;
void main()
{
	int ret=0;//用于记输出的个数
	cout<<"大于2018的10个素数有"<<endl;
	for(int i=2018;ret<10;i++)
	{
		int pri=1;//初始认为它是素数
		for(int j=2;j<=sqrt(i);j++)
		{
			if(i%j==0)
			{
				pri=0;
				break;//一旦能够判断它不是素数则无需继续直接跳出循环
			}
		}
		if(pri==1)
		{
			cout<<i<<'\t';
			ret++;
		}
	}
	cout<<endl;
}

运行结果显示
在这里插入图片描述

题二

题目: 请计算100-999的回文素数之和。
分析: 首先回文数指的是这个数字从左往右读与从右往左读得到的值相同,例如232,78987等,这里要求的回文素数是三位数,形式为aba。
这里的关键点是:三位数,回文数,素数。
切入点:首先三位数的回文数是很稀少的,那么我们先找出三位数中回文数,然后再在这些数中找出素数,并将其相加。这里要用到很多次判断是否为回文数,判断是否为素数,因此单独写出两个函数来实现。

#include<iostream>
#include<cmath>
using namespace std;
int huiwen(int x);
int su(int x);
void main()
{
	int sum=0;
	int count=0;
	int t;
	cout<<"回文素数分别为:"<<endl;
	for(int i=100;i<=999;i++)
	{
		t=huiwen(i)+su(i);
		if(t==2)
		{
			sum+=i;
			cout<<i<<'\t';
			count++;
		}
	}
	cout<<"100-999回文素数个数:"<<count<<endl;
	cout<<"100-999回文素数之和"<<sum<<endl;
}
//写判断三位数是否为回文数
int huiwen(int x)
{
	int ret=0;
	int a=x/100;
	int b=x%10;
	if(a==b)
	{ret=1;}
return ret;
}
//写判断是否为素数
int su(int x)
{
	int ret=1;
	for(int i=2;i<=sqrt(x);i++)
	{
		if(x%i==0)
		{
			ret=0;
			break;
		}
	}
return ret;
}

运行结果
在这里插入图片描述

题三

题目: 200元换成1元、5元、10元的纸币,每种纸币至少一张,有多少种换法。
分析: 先从大面值的开始,用循环实现,注意控制条件。
先从10元开始,再看5元,注意控制最后一种纸币的数目大于等于1

#include<iostream>
using namespace std;
void main()
{
	int count=0;
	for(int i=1;i<20;i++)
	{
		for(int j=1;j<40;j++)
		{
			int t=200-10*i-5*j;
			if(t>=1)//注意这里控制最后一种纸币的数量大于等于1
			{
			count++;
	cout<<"10元有"<<i<<"张\t"<<"5元有"<<j<<"张\t"<<"1元有"<<t<<"张"<<endl;
			}
		}
	}
	cout<<"共有"<<count<<"种方案"<<endl;
}

运行代码显示部分
在这里插入图片描述

题目四

题目: 约瑟夫问题。有N个人编号为1,2,3…N;这N个人围成一个圆,设定一个爆炸数m,从1号开始报数,报到第m号时该人被淘汰,接着从被淘汰者后一人重新报数1,报到第m号淘汰该人,…依次类推,最后留下来的人是胜者。
分析 利用数组,结合复制的思想。
初始化,定义一个较大的数组s,s[0]为0,s[i]=i,i<=N.
接着,用指针指向s[1],现在这个位置报数1,报数2时指针后移一位,报数1~m-1时将这些数组元素对应内容依次紧挨着复制到这一串数字最后。例如第一个复制s[1]的内容到s[N+1]位置。报数m时输出编号,但是不复制。

#include<iostream>
#define N 7 //起初7个人
#define m 3  //报数到3的人淘汰
using namespace std;
void main()
{
	int s[1000];//数组要长一点,方便存储
	//这个数组中未赋值的分量上都是-858993460
	for(int i=0;i<=N;i++)
	{
		s[i]=i;
	}
	int *p=&s[1];
	int ret=1;
	cout<<"约瑟夫环依次淘汰"<<endl;
	for(i=1;*p>0;i++)
	{
		if(i%m!=0)
		{
			s[N+ret]=*p;//这里不是每个依次赋值的
			ret++;
		}else{
		cout<<*p<<'\t';
		}
		p++;
		if((p+1)<0)
		{break;}
	}
	cout<<endl;
	cout<<"最后的胜者为"<<*(p-1)<<endl;
}

运行结果显示
在这里插入图片描述

题五

题目: 输出金字塔结构的图形
n=5层。这里数字之间没有空格,最后一行两端没有空格。
在这里插入图片描述
分析: 这里的数字只有0-9且不断循环重复,这里利用自然数对10取余的结果来实现。这里用循环一轮输出一层,在每层中也是循环,依次输出空格和数字。

#include<iostream>
#define N 5
using namespace std;
void main()
{
	int ret=0;
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=N-i;j++)
		{cout<<" ";}
		for(int t=1;t<=2*i-1;t++)
		{
			cout<<ret%10;
			ret++;
		}
		cout<<endl;
	}
}

运行结果显示
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值