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;
}
}
运行结果显示