洛谷 B2127 求正整数 2 和 n 之间的完全数 B2128 素数个数 B2144 阿克曼(Ackermann)函数 题解

这次是函数+数论+递归

目录:

No.1 B2127 求正整数 2 和 n 之间的完全数

No.2 B2128 素数个数 

No.3 B2144 阿克曼(Ackermann)函数 

第一题:B2127 求正整数 2 和 n 之间的完全数

题目描述

求正整数 2 和 n 之间的完全数(一行一个数)。

完全数:对于一个自然数,所有比它小的所有因数之和,等于它本身,它就是个完全数。如 6=1+2+3。

输入格式

输入 n(n≤10000)。

输出格式

一行一个数,按由小到大的顺序。

输入输出样例

输入 #1

10

输出 #1

6

输入 #2

100

输出 #2

6
28

思路:

定义一个判断完全数的函数......太简单了没什么好讲的

AC代码:

#include<bits/stdc++.h>//万能库
using namespace std;//cin,cout
bool isPerfectNumber(int n)//完全数的函数
{
    int sum=0;//因数的和
    for(int i=1;i<n;i++)//注意不是≤n
    {
        sum+=n%i==0?i:0;//三元biao达式
    }
    return sum==n;//如果等于n就是,否则不是
}
int main()//main函数
{
	int n;//定义变量
    cin >> n;//输入
    for(int i=2;i<=n;i++)//题目中写的从2~n
    {
        if(isPerfectNumber(i))//是完全数
        {
            cout<<i<<'\n';//输出,注意不要忘记换行
        }
    }
	return 0;//“愉快”的结束
}

第二题:B2128 素数个数

题目描述

编程求 2 ~ n(n 为大于 2 的正整数)中有多少个素数。

 

输入格式

输入 n(2≤n≤50000)。

输出格式

素数个数。

输入输出样例

输入 #1

10

输出 #1

4

思路:

定义判断质数的函数.....然后一个循环......

AC代码:

#include<bits/stdc++.h>//万能库
using namespace std;//cin,cout
bool isPrime(int n)//质数的函数
{
    for(int i=2;i<=n/i;i++)//不用讲吧
    {
        if(n%i==0)//能整除
        {
            return 0;//不是质数直接退出
        }
    }
    return n>=2;//小于2的数不是质数!!!
}
int main()//main函数
{
	int n;//定义变量
    cin >> n;//输入
    int cnt=0;//定义计数器
    for(int i=2;i<=n;i++)//题目中写的从2~n
    {
        if(isPrime(i))//是质数
        {
            cnt++;//计数器递增
        }
    }
    cout<<cnt;//输出
	return 0;//“愉快”的结束
}

第三道:B2144 阿克曼(Ackermann)函数

题目描述

阿克曼(Ackermann)函数 A(m,n) 中,m,n 定义域是非负整数(m≤3,n≤10),函数值定义为:

akm(m,n)=n+1;(m=0 时)。

akm(m,n)=akm(m−1,1);(m>0、n=0 时)。

akm(m,n)=akm(m−1,akm(m,n−1));(m,n>0 时)。

输入格式

m 和 n。

输出格式

函数值。

输入输出样例

输入 #1

2 3

输出 #1

9

思路:

弄个递归函数就行(各位有没有知道ACK4 3=几的?我都写了10几张纸了还是乱码)

AC代码:

#include<bits/stdc++.h>//万能库
using namespace std;//cin,cout
int ACK(int m,int n)//阿克曼函数
{
    if(!m)//m=0
    {
        return n+1;//返回n+1
    }
    else if(!n)//n=0
    {
        return ACK(m-1,1);//返回ACK(m-1,1);
    }
    else//n,m>0
    {
        return ACK(m-1,ACK(m,n-1));//返回ACK(m-1,ACK(m,n-1))
    }
}
int main()//main函数
{
	int m,n;//定义变量
    cin >> m >> n;//读入数据
    cout<<ACK(m,n);//输出
	return 0;//“愉快”的结束
}

这篇博客就到这里啦,我们下篇博客见!

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值