上机实验:过程的封装:函数(上)
判断素数
任务描述
本关任务:输入两个正整数m和n( $1\leq m \leq n\leq 100$ ),编写一个程序,统计并输出m~n之间(包含m和n)的素数的个数。
编程要求
定义并调用函数 isPrime(n) 来判断n是否是素数。
测试说明
平台会对你编写的代码进行测试:
测试输入:1 10;
预期输出:
4
测试输入:40 50;
预期输出:
3
提示: 对于数n,判断它是否是素数,不必枚举 [2,n-1] 之间的数,只需要枚举[2, $\sqrt n$ ]之间的数即可。
参考代码
#include<iostream>
using namespace std;
bool isPrime(int n)
{
/** Begin **/
if (n == 1) return false;
for (int i=2;i*i<=n;i++) if (n%i==0) return false;
return true;
/** End **/
}
int main()
{
int m, n;
cin >> m >> n;
/** Begin **/
int ans = 0;
for (int i=m;i<=n;i++) ans += isPrime(i);
cout << ans << endl;
/** End **/
return 0;
}
完全数
任务描述
完全数(perfect number),又称为完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和,恰好等于它本身。例如:28是一个完全数,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加:1+2+4+7+14=28.
编写程序,输入两个正整数m和n( $1\leq m\leq n\leq 10000$ ),输出m ~ n之间(包含m和n)的所有完全数。如果m ~ n之间没有完全数,则输出-1.
编程要求
定义并调用函数 perfectNumber(n) 判断 n 是否是完全数。
测试说明
平台会对你编写的代码进行测试:
测试输入:100 10000;
预期输出:
496 8128
测试输入:100 200;
预期输出:
-1
参考代码
#include<iostream>
using namespace std;
bool perfectNumber(int n)
{
/** Begin **/
int sum = 0;
for (int i=1;i<n;i++) if (n%i==0) sum += i;
return sum == n;
/** End **/
}
int main()
{
int m, n;
cin >> m >> n;
/** Begin **/
int f = 0;
for (int i=m;i<=n;i++) {
if (perfectNumber(i)) cout << i << " ", f = 1;
}
if (!f) cout << -1;
/** End **/
return 0;
}
冰雹猜想
任务描述
给出一个正整数 n $(n\leq 100)$ ,然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘 3 再加 1,否则除以 2。经过若干次循环后,最终都会回到 1。经过验证,很大的数字( $7\times10^{11}$ )都可以按照这样的方式变成 1,所以被称为“冰雹猜想”。例如:当 n 是 20,变化的过程是 [20, 10, 5, 16, 8, 4, 2, 1]; 而当 n 是 1 的时候,变化的过程是 [1].
根据给定的数字 n,验证这个猜想,即输出整个变化序列。
编程要求
定义并调用函数 valid(n),输出“冰雹猜想”的整个变化序列。
测试说明
平台会对你编写的代码进行测试:
测试输入:20
预期输出:
20 10 5 16 8 4 2 1
测试输入:68
预期输出:
68 34 17 52 26 13 40 20 10 5 16 8 4 2 1
参考代码
#include<iostream>
using namespace std;
void valid(int n)
{
/** Begin **/
cout << n << " ";
while (n>1) {
cout << (n=n%2?3*n+1:n/2) << " ";
}
/** End **/
}
int main()
{
int n;
cin >> n;
valid(n);
return 0;
}
统计正整数中指定数字的个数
任务描述
从键盘输入一个正整数 number,求其中含有指定数字 digit 的个数。
例如:从键盘输入正整数 number=1222 ,若 digit=2 ,则 1222 中含有 3 个 2。
编程要求
用函数实现,函数原型为:int CountDigit(int number,int digit)
测试说明
平台会对你编写的代码进行测试:
测试输入:1222 2;
预期输出:3
测试输入:1234 6;
预期输出:0
参考代码
#include<iostream>
using namespace std;
int CountDigit(int number,int digit)
{
/** Begin **/
int ans = 0;
while (number) ans += (number%10==digit), number/=10;
return ans;
/** End **/
}
int main()
{
int number, digit;
cin >> number >> digit;
cout << CountDigit(number,digit) <<endl;
return 0;
}