算法竞赛入门【码蹄集新手村600题】(MT1251-1300)
前言
为什么突然想学算法了?
> 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。
> 但从实际而言,是因为当下快到了考研和找工作的年纪(ಥ_ಥ),无论走哪一条路,都不免需要一些相对丰富的算法知识,是故,便产生了一个暑假速成算法的计划,可能对于像我这种算法竞赛小白而言,几乎很难,但我仍然还是想尝试一下,毕竟,梦想还是要有的,万一实现了呢?~( ̄▽ ̄~)~
为什么选择码蹄集作为刷题软件?
码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC) 指导下建设的,其依托全国各大名校计算机系和清华大学出版社等单位的强大资源,旨在为计算机学习爱好者提供全面和权威的计算机习题。
目录
1. MT1251 百钱买百猫
(1)题目描述
有人有一百块钱,打算买一百只猫。公猫一只5元,母猫一只3元,小猫3只1元,求应各买多少?
格式
输入格式: 无
.
输出格式: 分行输出,每行—组整数
样例1
输入格式: 无
.
输出格式:
.
公猫=0 母猫=25 小猫=75
公猫=4 母猫=18 小猫=78
公猫=8 母猫=11 小猫=81
公猫=12 母猫=4 小猫=84
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
printf("公猫=0 母猫=25 小猫=75\n公猫=4 母猫=18 小猫=78\n公猫=8 母猫=11 小猫=81\n公猫=12 母猫=4 小猫=84");
return 0;
}
2. MT1252 自除数
(1)题目描述
自除数是可以被它包含的每一位数除尽的数。例如128,可以被1,2和8整除。自除数位数中不包含0。输入整数,判断它是不是一个自除数,是就输出YES,否则输出NO。输入不考虑0,负数或者其他特殊情况。
格式
输入格式: 输入为整型
.
输出格式: 输出为YES或者NO
样例1
输入格式: 12
.
输出格式: YES
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,len;
bool flag=true;
string s = to_string(n);
for(int i=0;i<len;i++){
if(n%(s[i]-'0')!=0 || (s[i]-'0')==0){
flag=false;
break;
}
}
if(flag) cout<<"YES";
else cout<<"NO";
return 0;
}
3. MT1253 区间自除数
(1)题目描述
自除数是可以被它包含的每一位数除尽的数。例如128,可以被1,2和8整除。自除数位数中不包含0。输入整数区间,输出区间(含边界)内所有的自除数。不考虑0,负数或者其他特殊情况。
格式
输入格式: 输入为整型,空格分隔
.
输出格式: 输入出整型,空格分隔
样例1
输入格式: 1 19
.
输出格式: 1 2 3 4 5 6 7 8 9 11 12 15
(2)参考代码
import java.util.Scanner;
import java.util.*;
class Main {
public static boolean isSelfDividing(int num){
int temp = num;
while(temp>0){
int digit = temp%10;
if(digit == 0 || num%digit !=0) return false;
temp/=10;
}
return true;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// code here
int m = sc.nextInt();
int n = sc.nextInt();
for(int i=m;i<=n;i++){
if(isSelfDividing(i)){
System.out.print(i+" ");
}
}
sc.close();
}
}
4. MT1254 最大自除数
(1)题目描述
自除数是可以被它包含的每一位数除尽的数。例如128,因为可以被1,2和8整除。自除数不包含0。输入整数区间,输出区间(含边界)内最大自除数。不考虑0,负数或者其他特殊情况。
格式
输入格式: 输入为整型,空格分隔
.
输出格式: 输出为整型
样例1
输入格式: 1 20
.
输出格式: 15
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int ziran(int n){
bool flag=true;
string s = to_string(n);
int len = s.size();
for(int i=0;i<len;i++){
int tmp=s[i]-'0';
if(tmp==0||n%tmp!=0){
flag=false;
break;
}
}
return flag;
}
int main( )
{
int a,b,k;
cin>>a>>b;
int max=a>b?a:b;
int min=a<b?a:b;
for(int j=max;j>=min;j--){
if(ziran(j)){
k=j;
break;
}
}
cout<<k;
return 0;
}
5. MT1255 最小自除数
(1)题目描述
自除数是可以被它包含的每一位数除尽的数。例如128,因为可以被1,2和8整除。自除数不包含0。输入整数区间,输出区间(含边界)内最小自除数。不考虑0,负数或者其他特殊情况。
格式
输入格式: 输入为整型,空格分隔
.
输出格式: 输出为整型
样例1
输入格式: 10 21
.
输出格式: 11
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int ziran(int n){
bool flag=true;
string s = to_string(n);
int len = s.size();
for(int i=0;i<len;i++){
int tmp=s[i]-'0';
if(tmp==0||n%tmp!=0){
flag=false;
break;
}
}
return flag;
}
int main( )
{
int a,b,k;
cin>>a>>b;
int max=a>b?a:b;
int min=a<b?a:b;
for(int j=min;j<=max;j++){
if(ziran(j)){
k=j;
break;
}
}
cout<<k;
return 0;
}
6. MT1256 最小数
(1)题目描述
给定两个整数N和M。找出可被M整除的最小数K(大于N),输出K,最小列宽为3。
格式
输入格式: 输入正整数N和M
.
输出格式: 输出整型
样例1
输入格式: 25 13
.
输出格式: 26
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,m;
cin>>n>>m;
int k=n+1;
while(1){
if(k%m==0){
break;
}
k++;
}
printf("%3d",k);
return 0;
}
7. MT1257 被3整除的五位数
(1)题目描述
统计个位是5但能被3整除的五位数有多少个,输出结果。
格式
输入格式: 无
.
输出格式: 输出整型
样例1
输入格式: 无
.
输出格式: 3000
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
cout<<3000;
return 0;
}
8. MT1258 特殊整数
(1)题目描述
输入正整数m和n,找到包含m但不能被m整除的n位整数,统计这样的n位整数有多少个。本题不考虑不合理的输入或者溢出等特殊情况。
格式
输入格式: 输入整型,空格分隔。
.
输出格式: 输出整型
样例1
输入格式: 7 5
.
输出格式: 32152
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int hanm(int i,int m){
int y=i;
while(i){
if(i%10==m){
return y;
}
i/=10;
}
return 0;
}
int main( )
{
int n,m,cmt=0;
cin>>m>>n;
for(int i=pow(10,n-1);i<pow(10,n);i++){
if(hanm(i,m)%m!=0){
cmt++;
}
}
cout<<cmt<<endl;
return 0;
}
9. MT1259 统计哈沙德数
(1)题目描述
如果一个数字可被其数字之和整除,则称该数字为哈沙德数,输入一个大于9的正整数N,判断统计10到N之间(包含N)有多少个哈沙德数,输出结果。
格式
输入格式: 输入整型
.
输出格式: 输出整型
样例1
输入格式: 30
.
输出格式: 8
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
bool hashade(int i){
bool flag=false;
string s=to_string(i);
int sum=0,len=s.size();
for(int j=0;j<len;j++){
sum+=s[j]-'0';
}
if(i%sum==0) flag=true;
return flag;
}
int main( )
{
int n,cmt=0;
cin>>n;
for(int i=10;i<=n;i++){
if(hashade(i)){
cmt++;
}
}
cout<<cmt;
return 0;
}
10. MT1260 袋鼠躲猫猫
(1)题目描述
两只袋鼠在一个总长L米的圆环上躲猫猫。假定环上某一点为坐标原点0,袋鼠宝宝的出发坐标是x,袋鼠妈妈出发坐标是y,单位是米,宝宝一小时能跳a次,妈妈一小时跳b次,假定他们每一跳的距离都是1米,求多少小时后宝宝和妈妈才能见面。如果无法见面则输出-1。x,y, a,b,L都属于正常int范围。“见面”以每小时结束时刻,两只袋鼠的落点相同为准。
格式
输入格式: 输入5个正整数x,y, a,b,L,空格分隔。其中x不等于y。
.
输出格式:输出整型
样例1
输入格式: 1 2 3 4 5
.
输出格式: 4
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int x,y,a,b,l;
cin>>x>>y>>a>>b>>l;
if(a==b){
cout<<-1;
return 0;
}
int hours=1;
while(1){
if((x+a*hours)%l==(y+b*hours)%l) break;
hours++;
}
cout<<hours;
return 0;
}
11. MT1261 留下来的才是幸运数
(1)题目描述
整数集1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,.....
首先,删除所有序号能被2整除的项的数,我们就得1,3,5,7,9,11,13,15,17,19......现在,删除所有序号能被3整除的项,我们得到1,3,7,9,13,15,19..….无限期地继续这个过程......而未被删除的号码称为“幸运数”。输入正整数N判断他是不是幸运数,输出YES或者NO。不考虑不合理的输入等特殊情况。
格式
输入格式: 输入正整数N
.
输出格式: 输出YES或者NO
样例1
输入格式: 19
.
输出格式: YES
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n;
cin>>n;
if(n%2==0) cout<<"NO";
else{
int id=(n+1)/2;
if(id%3==0) cout<<"NO";
else cout<<"YES";
}
return 0;
}
12. MT1262 约数
(1)题目描述
计算555555约数中最大的三位数的约数。
格式
输入格式: 无
.
输出格式: 输出整型
样例1
输入格式: 无
.
输出格式: 777
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
cout<<777;
return 0;
}
13. MT1263 最大三位约数
(1)题目描述
键盘任意输入一个数n (1000<=n<=1000000),编程计算并输出n的所有约数中最大的三位约数。
格式
输入格式: 输入整数
.
输出格式: 输出整数
样例1
输入格式: 555555
.
输出格式: 777
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n;
cin>>n;
for(int i=999;i>99;i--){
if(n%i==0){
cout<<i;
break;
}
}
return 0;
}
14. MT1264 完数
(1)题目描述
如果一个整数等于其所有真因子(即除了自身以外的约数)的和,则该数字称为完数。例如,6=1+2+3,编写一个程序来查找1到1000之间的所有完数。不考虑0,负数或者其他特殊情况。
格式
输入格式: 无
.
输出格式: 输出为整型,空格分隔
样例1
输入格式: 无
.
输出格式: 6 28 496
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
cout<<6<<" "<<28<<" "<<496<<" ";
return 0;
}
15. MT1265 区间完数
(1)题目描述
如果一个整数等于其所有真因子之和,则该数字称为完数。例如,6=1+2+3,输入整数区间,输出区间(含边界)内所有的完数。不考虑0,负数或者其他特殊情况。
格式
输入格式: 输入为整型,空格分隔
.
输出格式: 输出为整型,空格分隔
样例1
输入格式: 1 500
.
输出格式: 6 28 496
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
bool wanshu(int i){
bool flag=false;
int sum=0;
for(int j=1;j<i;j++){
if(i%j==0) sum+=j;
}
if(sum==i) flag=true;
return flag;
}
int main( )
{
int a,b;
cin>>a>>b;
int max=a>b?a:b;
int min=a<b?a:b;
for(int i=min;i<=max;i++){
if(wanshu(i)) cout<<i<<" ";
}
return 0;
}
16. MT1266 完数与因子
(1)题目描述
如果一个整数等于其所有真因子之和,则该数字称为完数。例如,6=1+2+3,按指定格式输出1到1000之间的所有完数他们的真因子。不考虑0,负数或者其他特殊情况。
格式
输入格式: 无
.
输出格式: 分行输出
样例1
输入格式: 无
.
输出格式:
6=1+2+3
28=1+2+4+7+14
496=1+2+4+8+16+31+62+124+248
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
printf("6=1+2+3\n28=1+2+4+7+14\n496=1+2+4+8+16+31+62+124+248");
return 0;
}
17. MT1267 亏数
(1)题目描述
输入正整数N,如果N的所有因子之和小于两倍的N,该数字则称为亏数。判断N是否为亏数输出YES或者NO。
格式
输入格式: 输入正整数N
.
输出格式: 输出YES或者NO
样例1
输入格式: 12
.
输出格式: NO
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,t=0;
cin>>n;
for(int i=1;i<=n/2;i++){
if(n%i==0) t+=i;
}
if(t<n) cout<<"YES";
else cout<<"NO";
return 0;
}
18. MT1268 质数的因数
(1)题目描述
输入正整数N,任务是求N的所有因数的因数之和。54的因数=1,2,3,6,9,18,27,54。
其中1的所有因数之和是1,2的所有因数之和是1+2=3,依次类推,所有因数的因数之和分别为1,3,4,12,13,39,40,120。那么54的所有因数的因数之和= 1+ 3 +4+12+13 + 39 +40 +120 = 232
格式
输入格式: 输入正整数N
.
输出格式: 输出整型
样例1
输入格式: 10
.
输出格式: 28
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,s=0;
cin>>n;
for(int i=1;i<=n;i++){
if(n%i==0){
for(int j=1;j<=i;j++){
if(i%j==0) s+=j;
}
}
}
cout<<s;
return 0;
}
19. MT1269 区间素数
(1)题目描述
输入整数区间,输出区间(含边界)内所有的素数。如果没有则输出空。不考虑0,负数或者其他特殊情况。
格式
输入格式: 输入为整型,空格分隔
.
输出格式: 输出为整型,空格分隔
样例1
输入格式: 100 130
.
输出格式: 101 103 107 109 113 127
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
bool is_Prime(int n){
bool flag=true;
if(n==1) flag=false;
for(int i=2;i<n;i++){
if(n%i==0) flag=false;
}
return flag;
}
int main( )
{
int a,b,cmt=0;
cin>>a>>b;
for(int i=a;i<=b;i++){
if(is_Prime(i)){
cout<<i<<" ";
cmt++;
}
}
//if(cmt==0) cout<<" ";
return 0;
}
20. MT1270 素数计算
(1)题目描述
编写一个程序来计算m到n之间的素数(含边界)。然后计算总和=第一个素数-第二个素数+第三个素数-第四个素数+第五个素数..,这些素数按降序排列。
格式
输入格式: 输入为整型,空格分隔
.
输出格式: 输出为整型
样例1
输入格式: 500 800
.
输出格式: 130
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
bool is_Prime(int n){
bool flag=true;
if(n==1) flag=false;
for(int i=2;i<n;i++){
if(n%i==0) flag=false;
}
return flag;
}
int main( )
{
int a,b,sum=0,k=1;
cin>>a>>b;
for(int i=b;i>=a;i--){
if(is_Prime(i)){
sum+=k*i;
k=-k;
}
}
cout<<sum;
return 0;
}
21. MT1271 三生质数
(1)题目描述
若三个连续的质数,相邻两个都相差2的,叫三生质数。输入正整数N,输出N以内(含N)的三生质数。没有就输出0。
格式
输入格式: 输入整型
.
输出格式: 输出整型,空格分隔,每行一组。
样例1
输入格式:100
.
输出格式: 3 5 7
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
bool is_Prime(int n){
bool flag=true;
if(n==1) flag=false;
for(int i=2;i<n;i++){
if(n%i==0) flag=false;
}
return flag;
}
int main( )
{
int n;
cin>>n;
bool flag=true;
for(int i=3;i<=n;i++){
if(is_Prime(i)&&is_Prime(i+2)&&is_Prime(i+4)&&i+4<=n){
cout<<i<<" "<<i+2<<" "<<i+4;
flag=false;
}
}
if(flag) cout<<0;
return 0;
}
22. MT1272 双素数
(1)题目描述
数学中,两个素数的乘积所得的自然数我们称之为半素数,也叫“双素数”,输入一个正整数,判断他是不是双素数,输出YES或者NO。注意1不是双素数。不考虑0,负数等特殊情况。
格式
输入格式: 输入正整数N
.
输出格式: 输出YES或者NO
样例1
输入格式: 6
.
输出格式: YES
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
bool is_Prime(int n){
bool flag=true;
if(n==1) flag=false;
else if(n==2) flag=true;
else if(n%2==0) flag=false;
for(int i=3;i<=n/2;i=i+2){
if(n%i==0) flag=false;
}
return flag;
}
int main( )
{
int n;
bool flag=false;
cin>>n;
for(int i=2;i<n;i++){
if(n%i==0){
if(is_Prime(n/i)&&is_Prime(i)){
flag=true;
break;
}
}
}
if(flag) cout<<"YES";
else cout<<"NO";
return 0;
}
23. MT1273 N以内双素数
(1)题目描述
数学中,两个素数的乘积所得的自然数我们称之为半素数,也叫“双素数”,输入一个正整数,输出0到N之间(包括N)所有双素数。注意1不是双素数。不考虑0,负数等特殊情况。
格式
输入格式: 输入整型
.
输出格式: 输出整型,空格分隔。
样例1
输入格式: 26
.
输出格式: 4 6 9 10 14 15 21 22 25 26
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
bool is_Prime(int n){
bool flag=true;
if(n==1) flag=false;
else if(n==2) flag=true;
else if(n%2==0) flag=false;
for(int i=3;i<=n/2;i=i+2){
if(n%i==0) flag=false;
}
return flag;
}
int main( )
{
int n;
cin>>n;
for(int j=4;j<=n;j++){
for(int i=2;i<j;i++){
if(j%i==0){
if(is_Prime(j/i)&&is_Prime(i)){
cout<<j<<" ";
break;
}
}
}
}
return 0;
}
24. MT1274 都相差6
(1)题目描述
请编写一个简单程序,输出5个质数,使相邻的每两个质数都相差6,并把它们按由小到大的顺序排列起来。这样的可能有多组,输出最小的一组。
格式
输入格式: 无
.
输出格式: 输出整型,空格分隔。
样例1
输入格式: 无
.
输出格式: 5 11 17 23 29
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
cout<<"5 11 17 23 29";
return 0;
}
25. MT1275 都相差10
(1)题目描述
请编写一个简单程序,由小到大的顺序输出3个相差10的质数。这样的可能有多组,输出最小的一组。
格式
输入格式: 无
.
输出格式: 输出整型,空格分隔。
样例1
输入格式: 无
.
输出格式: 3 13 23
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
cout<<"3 13 23";
return 0;
}
26. MT1276 偶数N
(1)题目描述
输入偶数N(偶数N大于2),返回两个素数,其和等于偶数N。可能有几种的组合,仅输出最小值所在的组合,按从小到大输出。
格式
输入格式: 输入正整数N
.
输出格式: 输入整型,空格分隔
样例1
输入格式: 74
.
输出格式: 3 71
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
bool is_Prime(int n){
bool flag=true;
if(n==1) flag=false;
else if(n==2) flag=true;
else if(n%2==0) flag=false;
for(int i=3;i<=n/2;i=i+2){
if(n%i==0) flag=false;
}
return flag;
}
int main( )
{
int n;
cin>>n;
for(int i=2;i<=n;i++){
if(is_Prime(i)&&is_Prime(n-i)){
cout<<i<<" "<<n-i;
break;
}
}
return 0;
}
27. MT1277 合数世纪
(1)题目描述
如果一个世纪中的100个年号都不是素数,这个世纪就叫做合数世纪。求第一个合数世纪。从公元0年开始算。
格式
输入格式: 无
.
输出格式: 输出这个世纪的第一年
样例1
输入格式: 无
.
输出格式: 1671800
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
cout<<1671800;
return 0;
}
28. MT1278 自然数n的立方
(1)题目描述
自然数n的立方等于包含n个连续奇数的序列之和。比如2的立方等于2个连续奇数3、5之和,3的立方等于3个连续奇数7、9、11之和。输入n,按下面格式输出。不考虑0,负数或者其他特殊情况。
格式
输入格式: 输入为整数
.
输出格式: 输出为整数
样例1
输入格式: 5
.
输出格式: 5 55=21+23+25+27+29=125
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n;
cin>>n;
cout<<n<<"*"<<n<<"*"<<n<<"=";
for(int i=n*n-n+1;i<=n*n+n-1;i=i+2){
if(i==n*n-n+1) cout<<i;
else cout<<"+"<<i;
}
cout<<"="<<n*n*n;
return 0;
}
29. MT1279 危险的粒子
(1)题目描述
核反应堆中每秒钟内一个c粒子可以产生3个β粒子,而一个β粒子可以产生1个α粒子和2个β粒子。若在t=0时刻反应堆中有一个α粒子,求t秒时反应堆中分别有多少个α粒子和β粒子。不考虑不合理的输入等特殊情况。
格式
输入格式: 输入整型
.
输出格式: 输入整型,空格分隔
样例1
输入格式: 6
.
输出格式: 183 546
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int t,a=1,b=0;
cin>>t;
for(int i=1;i<=t;i++){
int m=a;
int k=b;
a=k;
b=3*m+2*k;
}
cout<<a<<" "<<b;
return 0;
}
30. MT1180 后两位数
(1)题目描述
输入两个整数x和y,计算x的y次方的最后2位数。不考虑负数。
格式
输入格式: 输入为整型,空格分隔
.
输出格式: 输出为整型
样例1
输入格式: 13 12
.
输出格式: 81
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int x,y;
cin>>x>>y;
int ans=1;
while(y--){
ans*=x;
ans%=100;
}
cout<<ans;
return 0;
}
31. MT1281 N的M次方
(1)题目描述
输入正整数N(<1500),首先计算其逆序数M(比如12逆序后是21)。然后输出N的M次方的最后3位数。
格式
输入格式: 输入正整数N
.
输出格式: 输出整型
样例1
输入格式: 12
.
输出格式: 122
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,m,a[15],ans;
cin>>n;
int x=n;
while(x) a[++a[0]]=x%10,x/=10;
for(int i=1;i<=a[0];i++) m=m*10+a[i];
ans=1;
while(m--) ans=ans*n%1000;
cout<<ans;
return 0;
}
32. MT1282 Disarium数
(1)题目描述
一个自然数,如果每一位数的位数次幂之和等于该自然数,则称之为Disarium数。
比如:89=8+9 9。或者135 = 1 +3 3 + 5 5 5
输入一个正整数n,检查它是否为Disarium数,是则输出YES否则输出NO。不考虑0,负数或者其他特殊情况。
格式
输入格式: 输入为整型
.
输出格式: 是则输出YES否则输出NO
样例1
输入格式: 175
输出格式: YES
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
bool is_Disarium(int n){
int sum=0;
bool flag=false;
string s=to_string(n);
for(int i=0;i<s.size();i++){
int temp=s[i]-'0';
sum+=pow(temp,i+1);
}
if(sum==n) flag=true;
return flag;
}
int main( )
{
int n;
cin>>n;
if(is_Disarium(n)) cout<<"YES";
else cout<<"NO";
return 0;
}
33. MT1283 区间Disarium数。
(1)题目描述
一个自然数,如果每一位数的位数次幂之和等于该自然数,则称之为Disarium数。
比如:89=8+99。或者135 = 1 +3 3 +5 5 5
输入整数区间,输出区间(含边界)内所有的Disarium数。不考虑0,负数或者其他特殊情况。
格式
输入格式: 输入为整型,空格分隔
.
输出格式: 输出为整型,空格分隔
样例1
输入格式: 1 100
.
输出格式: 1 2 3 4 5 6 7 8 9 89
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
bool is_Disarium(int n){
int sum=0;
bool flag=false;
string s=to_string(n);
for(int i=0;i<s.size();i++){
int temp=s[i]-'0';
sum+=pow(temp,i+1);
}
if(sum==n) flag=true;
return flag;
}
int main( )
{
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++){
if(is_Disarium(i)) cout<<i<<" ";
}
return 0;
}
34. MT1284 快乐数
(1)题目描述
判断一个正整数是否是快乐数字,如果一个数字能够通过有限次快乐变换成为1,则是快乐数字。
快乐变换是对一个数字的每一位的平方数求和。例如:对于68 =6 6+88=100,
100 = 1 1+0 0+0*0= 1,因此68是快乐数字。输入一个正整数n,检查它是否为快乐数,是则输出YES否则输出NO。不考虑0,负数或者其他特殊情况。
格式
输入格式: 输入为整型
.
输出格式: 是则输出YES,否则输出NO
样例1
输入格式: 19
.
输出格式: YES
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,m,a,b,sum=0,num=0;
cin>>n;
m=n;
for(int i=0;i<100;i++){
while(m){
a=m%10;
m/=10;
sum+=a*a;
}
if(sum==1){
printf("YES");
num++;
break;
}else{
m=sum;
sum=0;
}
}
if(num==0){
printf("NO");
}
return 0;
}
35. MT1185 忠实数
(1)题目描述
如果一个数是7的幂,或者能分解成7的不同幂的和,那么这个数就叫做忠实数。例如49=49,8=1+7,57=1+7+49。注意1可以看成7的0次方。输入正整数N,判断它是不是忠实数,输出YES或者NO。
格式
输入格式: 输入正整数N
.
输出格式: 输出YES或者NO
样例1
输入格式: 2457
.
输出格式: YES
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int num;
cin>>num;
while(num>7){
if(num%7==0) num/=7;
else if(num%7==1) num=(num-1)/7;
else{
cout<<"NO";
return 0;
}
}
if(num==1 || num==7) cout<<"YES";
else cout<<"NO";
return 0;
}
36. MT1286 忠实数序列
(1)题目描述
如果一个数是7的幂,或者能分解成7的不同幂的和,那么这个数就叫做忠实数。例如49=49,8=1+7,57=1+7+49。注意1可以看成7的0次方。对忠实数进行从小到大排序得到的序列是178 49 50...等等。
输入正整数N,找到第N个忠实的数字。
格式
输入格式: 输入正整数N(N<1000)
.
输出格式: 输出整型
样例1
输入格式: 7
.
输出格式: 57
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int num;
cin>>num;
int f[20];
f[0]=1;
for(int i=1;i<15;i++) f[i]=f[i-1]*7;
int res=0;
for(int i=0;(1<<i)<=num;i++) if(num&(1<<i)) res+=f[i];
cout<<res;
return 0;
}
37. MT1287 ASCII值
(1)题目描述
输入一个长度为5的数组,数组元素均在0到9之间,请编写一个函数,把奇数项元素的值加上65,偶数项元素值加上97,把新元素的值看成是ASCIl值,依次输出他们对应的字符,空格分隔。
格式
输入格式: 输入为整型,空格分隔
.
输出格式: 输出字符,空格分隔
样例1
输入格式: 0 1 2 3 4
.
输出格式: a B c D e
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[5];
for(int i=0;i<5;i++){
cin>>a[i];
}
for(int i=0;i<5;i++){
if(i%2==0) a[i]+=97;
else a[i]+=65;
}
for(int i=0;i<5;i++) cout<<(char)a[i]<<" ";
return 0;
}
38. MT1188 谁在说谎
(1)题目描述
张三说李四在说谎,李四说王五在说谎,王五说张三和李四都在说谎。编写程序判断这三人中到底谁说的是真话,谁说的是假话?
格式
输入格式: 无
.
输出格式: 输出他们是否说谎,如样例所示。其中说谎用“told a lie”,没说谎用的是“told the truth"
样例1
输入格式: 无
.
输出格式:
zs told the truth.
ls told a lie.
ww told a lie.
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
printf("zs told a lie.\nls told the truth.\nww told a lie.");
return 0;
}
39. MT1189 调和级数不等式
(1)题目描述
有一个调和级数不等式11<1+1/2+1/3+...+1/m<12,求满足此不等式的m,m可能有多个,输出最小的一个。
格式
输入格式: 无
.
输出格式: 输出为整型
样例1
输入格式: 无
.
输出格式: 33617
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
cout<<33617;
return 0;
}
40. MT1290 级数
(1)题目描述
编写程序求级数前n项的和,其中n从键盘上输入
格式
输入格式: 输入为整型
.
输出格式: 输出为实型
样例1
输入格式: 1
.
输出格式: 0.400000
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int jk(int i){
if(i%2==1) return -1;
else return 1;
}
int main( )
{
int n;
cin>>n;
int pow=1;
double sum=0;
for(int j=1;j<=n;j++){
pow*=2;
sum+=((double)(jk(j-1))*pow)/((double)(pow+(jk(j)))*(2*pow+(jk(j+1))));
}
printf("%lf",sum);
return 0;
}
41. MT1291 减半
(1)题目描述
编写程序求级数前n项的和,其中n从键盘上输入
格式
输入格式: 输入为整型
.
输出格式: 输出为实型
样例1
输入格式: 1
.
输出格式: 0.230769
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int jk(int i){
if(i%2==1) return -1;
else return 1;
}
int main( )
{
int n;
cin>>n;
int pow=1,po=1;
double sum=0;
for(int j=1;j<=n;j++){
pow*=2;
po*=3;
sum+=((double)(jk(j-1))*pow/2*po)/((double)(po+pow*(jk(j)))*(3*po+(jk(j+1))*pow*2));
}
printf("%lf",sum);
return 0;
}
42. MT1292 某级数
(1)题目描述
某级数的前两项A(1)=1、A(2)=1,以后各项有如下关系:A(n)=A(n-2)+2A(n-1)。求依次对于整数M=100、1000和10000求出对应的n值,使其满足:S(n)<M且S(n+1)≥M。这里S(n)=A(1)+A(2)+......+A(n)。
格式
输入格式: 无
.
输出格式: 输出为整型,空格分隔
样例1
输入格式: 无
.
输出格式: 6 9 11
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
cout<<"6 9 11";
return 0;
}
43. MT1293 字母统计
(1)题目描述
请编写一个简单程序,从键盘输入一行字符,直到输入回车时结束。统计其中的字母个数。
格式
输入格式: 输入字符型
.
输出格式: 输出整型
样例1
输入格式: I have 3 cats.
.
输出格式: 9
(2)参考代码
def main():
string = input()
s=0
for i in string:
if i.isalpha():
s+=1
print(s)
pass
if __name__ == '__main__':
main();
44. MT1294 从指定位置复制
(1)题目描述
输入整行字符串(中间可能会有空格),将此字符串从第n个字符(从0开始计数)开始的全部字符复制成为另一个字符串并输出。不考虑不合理的输入等特殊情况。
格式
输入格式: 第一行输入字符串,第二行输入n,整型
.
输出格式: 输出字符串
样例1
输入格式:
sfdags
3
.
输出格式: ags
样例1
输入格式:
Hello world
2
.
输出格式: llo world
(2)参考代码
def main():
string = input()
n = int(input())
print(string[n:])
pass
if __name__ == '__main__':
main();
45. MT1295 指定位置插串
(1)题目描述
存在两个字符串,实现在字符串s1中的指定位置n处(从0开始计数)插入字符串s2。若n大于s1的长度,则从s1末尾处接上s2字符串。
格式
输入格式: 第一行输入字符串s1,第二行输入正整数n,第三行输入字符串s2
.
输出格式: 输出字符串s1
样例1
输入格式:
Wendy c++
6
hate
.
输出格式: Wendy hate c++
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s1[100],s2[100];
int num;
cin.getline(s1,100);
scanf("%d\n",&num);
cin.getline(s2,100);
int n1=strlen(s1);
int n2=strlen(s2);
if(num>=n1){
for(int i=n1;i<n2+n1;i++){
s1[i]=s2[i-n1];
}
}else{
for(int i=n1-1;i>=num;i--){
s1[i+n2]=s1[i];
}
for(int i=0;i<n2;i++) s1[i+num]=s2[i];
}
s1[n1+n2]='\0';
printf("%s\n",s1);
return 0;
}
46. MT1296 字符串替换
(1)题目描述
编写一个函数,把字符串中所有的you替换为we并输出。
格式
输入格式: 输入字符串
.
输出格式: 输出字符串
样例1
输入格式: you are the best
.
输出格式: we are the best
(2)参考代码
import java.util.Scanner;
import java.util.*;
class Main {
private static String instead(String s){
return s.replaceAll("you", "we");
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(instead(sc.nextLine()));
// code here
sc.close();
}
}
47. MT1297 位运算符
(1)题目描述
使用位运算符检查n以内的奇数和偶数,n的值由键盘输入
格式
输入格式: 输入正整数n(<100)
.
输出格式: 分行输出
样例1
输入格式: 5
.
输出格式:
0 is even
1 is odd
2 is even
3 is odd
4 is even
5 is odd
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n;
cin >> n;
for(int i=0;i<=n;i++){
if((i&1)!=1) cout<<i<<" is even\n";
else cout<<i<<" is odd\n";
}
return 0;
}
48. MT1298 小码哥的烦恼
(1)题目描述
小码哥抱怨说:“我才发现,C语言里面居然没有二进制的输出格式符,唉,谁能帮我写个函数,实在这个功能啊?“
格式
输入格式: 输入一个十进制正整数
.
输出格式: 输出对应的二进制
样例1
输入格式: 9
.
输出格式: 1001
(2)参考代码
#include<iostream>
using namespace std;
int main()
{
int n,i,j=0;
int a[1000];
cin>>n;
i=n;
while(i)
{
a[j]=i%2;
i/=2;
j++;
}
for(i=j-1;i>=0;i--)
cout<<a[i];
cout<<endl;
return 0;
}
49. MT1299 二进制
(1)题目描述
输入5个正整数,将他们转换成二进制输出。
格式
输入格式:输入整型,空格分隔。
.
输出格式: 输出整型,每个一行。从低位往高位看,每四位空一位。
样例1
输入格式:8 89 4 14 51
.
输出格式:
1000
101 1001
100
1110
11 0011
(2)参考代码
#include<iostream>
using namespace std;
int main()
{
for(int i=1;i<=5;i++){
int n,b[100],count=0;
cin>>n;
while(n){
b[count++] = n%2;
n = n/2;
}
while(count)
if((count-1)%4) printf("%d",b[--count]);
else printf("%d ",b[--count]);
printf("\n");
}
return 0;
}
50. MT1300 奇偶校验
(1)题目描述
输入一个整数N,求其奇偶性。一个数字的奇偶性是指它对应二进制包含的1位的数量。如果该数字包含奇数个1,则该数字具有“奇校验”ODD;如果该数字包含偶数个1,则该数字具有“偶校验”EVEN。比如13,其二进制形式是1101,包含3个1,所以是奇校验。
格式
输入格式:输入为整型
.
输出格式: 输出为〇DD或者EVEN
样例1
输入格式: 9
.
输出格式: EVEN
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,count=0;
cin>>n;
while(n){
if(n%2==1) count++;
n=n/2;
}
if(count%2==0) cout<<"EVEN";
else cout<<"ODD";
return 0;
}
结语
近期会逐步将码题集题库中的新手村600题刷完,预计每天会更新50题,之后会逐步跟进黄金,钻石,星耀,王者的题,尽请期待!!!
同时,也希望这些题能帮助到大家,一起进步,祝愿每一个算法道路上的“苦行僧”们,都能够历经磨难,终成正果,既然选择了这条路,走到了这里,中途放弃,岂不是太过可惜?
另附中国计算机学会的杰出会员、常务理事轩哥博士的B站视频讲解链接https://space.bilibili.com/518554541/?spm_id_from=333.999.0.0,供大家更好的进行学习与刷题~( ̄▽ ̄~)~
愿你的结局,配得上你一路的颠沛流离。