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
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,不能达到我们判断素数的要求