吉林大学超星MOOC学习通高级语言程序设计 C++ 实验03 模块化程序设计(2021级)
作者:互联网
一. 单选题(共1题,16.6分)
1. (单选题)
有函数定义:int f(int x,int y);则下列函数调用正确的为( )
- A.int n; n=f();
- B. int n,a=0,b=1;n=int f(x,y);
- C. int n,a=0,b=1;n=f(a,b);
- D.int n,a=0,b=1; n=f(int a,int b);
我的答案: C
二. 程序题(共5题,83.4分)
2. 自守数
题目编号:Exp03-Extend01,GJBook3-12-04
题目名称:自守数
题目描述:若一个正整数a满足条件 a^2 的尾数等于a,则称a为自守数,例如:
25^2=625 、76^2=5776 、9376^2=87909376 都是自守数。
编写程序,求小于等于n的所有自守数。
输入:从键盘随机输入一个正整数n(<10000000)。
输出:输出小于n的所有自守数,每个数之间以一个西文空格间隔。
样例1:
输入:10输出:1 5 6样例2:
输入:100输出:1 5 6 25 76
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
long long x = 0;
cout << "1 ";
for (int i = 2;i < n;i++)
{
int j = 10000000;
x = i * i;
while (j / i >= 10)
{
j /= 10;
}
x %= j;
if (x == i)
cout << i << " ";
}
return 0;
}
谈一谈对这个题的想法:x=a*a
1.首先,厘清题目对 “自首数”的定义
2.其次,题目的关键在于如何寻找x的尾数
下面重点来讲第二点:仔细思考后会发现,对 x 取逆序用处不大,用数组也不是很方便;
所以我们可以将其转化为求a的位数再加1,最后 取模即可。
那么问题又来了,如何求a的位数呢?
就把这个任务交给while循环吧,
int j = 10000000;
while (j / i >= 10)
{
j /= 10;
}
最后得出的j值恰好为a的位数再加1,
x%j恰好为x的尾数 ,再与a比较即可
3. 组合问题
题目编号:Exp03-Basic01,GJBook3-05-02
题目名称:组合问题
题目描述:编写程序,输入m,n的值,计算并输出函数f的值。
输入:一个整数m和一个整数n(m,n≤20)。
输出:函数f的值。
样例1:
输入:-1 2输出:-1样例2:
输入:2 2输出:1
如果对阶乘还不熟悉的同学建议看吉林大学超星MOOC学习通高级语言程序设计 C++ 实验02 分支与循环程序设计(2021级)(1)_S_CuRrY666的博客-CSDN博客 还是闲话少叙,直接上代码
#include <iostream>
using namespace std;
long long jiec(int n)
{
long long sum = 1;
for (int i = 1;i <= n;i++)
{
sum *= i;
}
return sum;
}
int main()
{
int m, n;
cin >> m >> n;
if ((m < n) && (m > 0) && (n > 0))
cout << "0" << endl;
else if ((m == n) && (m > 0) && (n > 0))
cout << "1" << endl;
else if ((m > n) && (m > 0) && (n > 0))
{
long long sum;
sum = jiec(m) / jiec(m - n) / jiec(n);
cout << sum << endl;
}
else cout << "-1" << endl;
return 0;
}
这道题写了一个jiec的函数,旨在求阶乘,因为涉及到的阶乘有三个,所以把阶乘放在主函数里会十分不方便
4. 逆序数
题目编号:Exp03-Basic02,GJBook3-05-06
题目名称:逆序数
题目描述:编写函数,求任意位自然数的逆序数,例如5432就是2345的逆序数。
输入:任意一个整数(<10^18) 。
输出:如果输入的不是自然数,则输出NULL;否则输出对应的逆序数。
样例1:输入:120输出:21样例2:
输入:999999999999999999输出:999999999999999999样例3:
输入:-1357输出:NULL
#include <iostream>
using namespace std;
int main()
{
long long m;
int n = 0;
cin >> m;
if (m <= 0)
cout << "NULL" << endl;
else if (m > 0)
{
while (m > 0)
{
n++;
int a = 0;
a = m % 10;
if (a != 0 || n != 1)
printf("%d", a);
m /= 10;
}
}
return 0;
}
这个程序最重要的一点就是中间的while循环 ,观察输出样例,若输入的数尾数为0,则将其略去,所以对最后一个数要判断一下,先定义n=0,进入while循环后n=1,若a=0,不输出,随后直接逆序输出即可。
5. 多边形周长
题目编号 :Exp03-Basic03
题目名称:多边形周长
题目描述:编写程序,求由键盘按顺时针方向输入n(0<n<=10)个顶点坐标的多边形周长(测试数据已保证当n>2时,各点按输入方向依次连接可构成封闭的n边形)。
输入:第一行输入一个整数,作为n值;以后每行两个浮点数(double),为多边形各顶点的坐标。
输出:多边形的周长,精确到小数点后2位。
样例1:
输入: 4 0 0 0 1 1 1 1 0输出:4.00样例2:
输入: 1 2 3输出: 0.00样例3:
输入: 2 2 3 2 4输出: 1.00
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
double dist(double x1, double y1, double x2, double y2) {
double d = 0;
d = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
return d;
}
int main()
{
int n = 0;
cin >> n;
double sum = 0, arr[10][2];
for (int i = 0;i < n;i++)
{
for (int j = 0;j < 2;j++)
{
cin>>arr[i][j];
}
}
if (n == 1)cout << "0.00" << endl;
if (n == 2)
{
sum = dist(arr[0][0], arr[0][1], arr[1][0], arr[1][1]);
//printf("%.2lf", sum);
cout << fixed << setprecision(2) << sum << endl;
}
if (n > 2)
{
for (int i = 0;i < n - 1;i++)
{
for (int j = 0;j < 1;j++)
{
sum += dist(arr[i][j], arr[i][j + 1], arr[i + 1][j], arr[i + 1][j + 1]);
}
}
sum += dist(arr[0][0], arr[0][1], arr[n - 1][0], arr[n - 1][1]);
//printf("%.2lf", sum);
cout << fixed << setprecision(2) << sum << endl;
}
return 0;
}
将n分三种情况讨论比较好,别忘了当n>2时,图形是首尾闭合的。
6.素数判断
【计2014级期中试题】素数判断。
问题描述:一个大于1的自然数,只能被1和它本身整除,不能被其它除0以外的自然数整除,则该数称之为素数。编写函数,判断一个整数是否为素数。
注:判断素数部分必须编写成一个独立于main()函数的其它函数。
输入:一个大于1的自然数
输出:根据是否是素数输出Y/N
样例1:
输入:3
输出:Y
样例2:
输入:51
输出:N
#include <iostream>
using namespace std;
char su(int x)
{
char ch = 'Y';
for (int i = 2;i < x;i++)
{
if (x % i == 0)
{
ch = 'N';
break;
}
else continue;
}
return ch;
}
int main()
{
int m;
cin >> m;
cout << su(m) << endl;
return 0;
}
判断素数的时候,for循环中的i一定要从2开始,因为任何数模1都为0,不能达到我们判断素数的要求
标签:输出,arr,03,int,样例,long,超星,程序设计,输入 来源: https://blog.csdn.net/S_CuRrY666/article/details/121406235