程序开发实训 【专题七】 数学求解(基础)
包含题目
1、回文数
2、孪生数
3、同构数
4、相亲数
5、素数
6、最小素数集
注意
1.以下代码仅供参考,不代表最优解。
2.代码的运行结果与编译环境有关,以下代码均通本地测试,如果代码存在无法编译或输出异常,请检查运行环境。
3.如果发现问题或者您有更优的解,欢迎加群交流。
# 1、回文数
【问题描述】
所谓回文数是指具有如下性质的整数:一个整数,当它的各位数字逆序排列,形成的整数与原整数相同,这样的数称为回文数。例如,素数 11,373,其各位数字对换位置后仍然为 11,373,因此这两个整数均为回文数。 编写函数 int loop(int x),判断一个整数是否为回文数,如果 x 是回文数则返回 1,否则返回 0。编写程序 loop.c,接收控制台输入的两个整数 a,b。调用 loop 函数输出 a 到 b 之间(包括 a 和 b)的所有回文数
【输入形式】
控制台输入两个整数 a 和 b(必有 a<b),以空格分隔。
【输出形式】
输出有若干行,每行有一个 a 和 b 之间的回文数。输出各行上的数字不重复,且从小至大依次按序输出。
【样例输入】
3 120
【样例输出】
3
4
5
6
7
8
9
11
22
33
44
55
66
77
88
99
101
111
【样例说明】
输入整数 a=3,b=120,要求输出所有[3, 120]之间的回文数。按升序分行输出所有符合题意的整数。
#include <iostream>
using namespace std;
int loop(int x)
{
int m = 0, n = 0;
n = x;
while (n > 0)
{
m = m * 10 + n % 10;
n /= 10;
}
if (m == x)
return 1;
else
return 0;
}
int main()
{
int start, ended;
cin >> start >> ended;
for (int i = start; i <= ended; i++)
{
if (loop(i) == 1)
cout << i << endl;
}
return 0;
}
# 2、孪生数
【问题描述】
孪生数定义: 如果 A 的约数(因数,包含 1,但不包含 A 本身)之和等于 B , B 的约数(因数)之和等于 A , A 和 B 称为孪生数(A 和 B 不相等)。试找出正整数 M 和 N 之间的孪生数。
【输入形式】
从控制台输入两个正整数 M 和 N(1<=M<N<=20000),中间用一个空格分隔。
【输出形式】
在标准输出上输出符合题目描述的 M 和 N 之间的全部孪生数对(包括 M 和 N)。每行输出一对孪生数,用一个空格隔开,小的先输出;各行孪生数按照第一个数从小到大的顺序输出,一对孪生数只输出一次。 如果没有符合要求的孪生数对,则输出字符串 NONE。
【输入样例 1】
20 300
【输出样例 1】
220 284
【输入样例 2】
200 250
【输出样例 2】
NONE
#include <iostream>
using namespace std;
int sumf(int x)
{
int sum = 0;
for (int i = 1; i < x; i++)
if (x % i == 0)
sum += i;
return sum;
}
int main()
{
int m, n;
int sumf1 = 0, sumf2 = 0;
int flag = 0;
cin >> m >> n;
for (int i = m; i <= n; i++)
{
sumf1 = sumf(i);
sumf2 = sumf(sumf1);
if (sumf2 > n)
continue;
if (i == sumf2)
if (i != sumf1 && i < sumf1)
{
flag = 1;
cout << i << " " << sumf1 << endl;
}
}
if (flag == 0)
cout << "NONE";
return 0;
}
# 3、同构数
【问题描述】
具有下面性质的数 a 称为“同构数”: 设 b 是 a 的平方,a 与 b 的低若干位相同。 例如,5 是 25 的同构数,25 是 625 的同构数
编程序满足如下要求: 输入两个整数 a,b (0<=a, b<=99),找出 a、b 之间全部的同构数。
【输入形式】
从键盘输入 0-99 之间的两个整数 a 和 b,以空格隔开。
【输出形式】
在屏幕上按照由小到大的顺序输出所有同构数,每一个整数占一行。
【输入样例】
0 30
【输出样例】
0
1
5
6
25
#include <iostream>
using namespace std;
int main()
{
int m = 0, n = 0;
int powerNum = 0;
cin >> m >> n;
for (int i = m; i <= n; i++)
{
powerNum = i * i;
if (i == powerNum % 10 && i < 10)
cout << i << endl;
else if (i == powerNum % 100 && i >= 10)
cout << i << endl;
}
return 0;
}
# 4、相亲数
2500 年前数学大师毕达哥拉斯就发现,220 和 284 两数之间存在着奇妙的联系: 220 的因数之和(除了自身之外的因数)为:110+55+44+22+20+11+10+5+4+2+1=284,284 的因数之和为:142+71+4+2+1=220。 毕达哥拉斯把这样的数对称为相亲数。输入两个正整数(大于 1 并且在 int 的表示范围之内),分别计算它们所有因数之和(除了自身之外的因数),并判断它们是否是一对相亲数。
【输入形式】
从标准输入输入两个正整数,以一个空格分隔这两个正整数。
【输出形式】
以输入的先后顺序分行输出:输入的正整数,后跟英文逗号,再从除自身之外的最大的因数开始输出其因数相加的公式(最小的因数 1 之后没有加号),最后输出英文等号和因数之和。注意:所有输出元素间无空格。 若它们是一对相亲数,则在新的一行上输出 1;若不是则在新的一行上输出 0。
【样例输入 1】
220 284
【样例输出 1】
220,110+55+44+22+20+11+10+5+4+2+1=284
284,142+71+4+2+1=220
1
【样例输入 2】
2560 3282
【样例输出 2】
2560,1280+640+512+320+256+160+128+80+64+40+32+20+16+10+8+5+4+2+1=3578
3282,1641+1094+547+6+3+2+1=3294
0
【样例说明】
样例 1 中输入的两个正整数为 220 和 284,220 的因数之和为 284,284 的因数之和为 220,所以它们是一对相亲数,最后输出 1; 例 2 中输入的两个正整数是 2560 和 3282,2560 的因数之和为 3578,3282 的因数之和为 3294,所以它们不是一对相亲数,最后输出 0。
#include <iostream>
using namespace std;
int sumFactorAndFormat(int x)
{
int sumX = 0;
for (int i = x / 2; i >= 1; i--)
{
if (i == x / 2)
cout << x << ",";
if (x % i == 0)
if (i != 1)
{
sumX += i;
cout << i << "+";
}
else
{
sumX += i;
cout << 1 << "=" << sumX << endl;
}
}
return sumX;
}
int main()
{
int m = 0, n = 0;
int sumM = 0, sumN = 0;
cin >> m >> n;
sumM = sumFactorAndFormat(m);
sumN = sumFactorAndFormat(n);
if (sumM == n)
cout << 1;
else
cout << 0;
return 0;
}
# 5、素数
【问题描述】
从控制台输入整数 n(n>=1),计算并输出从 1 到 n 之间(包括 n)个位为 1 的所有素数,若没有符合要求的素数,则输出-1。
【输入形式】
从控制台输入整数 n。
【输出形式】
按照从小到大的顺序,在一行上输出 1 到 n 之间(包括 n)个位为 1 的所有素数,素数之间用一个空格分隔,若没有符合要求的素数,则输出-1。
#include <iostream>
using namespace std;
int main()
{
int pre = 0, end;
int count = 0;
cin >> end;
for (int i = pre; i <= end; i++)
{
//检查数字当前数字i是否素数
for (int j = 2; j <= i - 1; j++)
{
//如果不是素数则跳出寻找下一个数
if (i % j == 0)
break;
if (j == i - 1)
if ((i - 1) % 10 == 0)
{
count++;
cout << i << " ";
}
}
}
if (count == 0)
cout << -1;
return 0;
}
# 6、最小素数集
【问题描述】
由数学基本定理可知:任何一个大于 1 的非素数整数都可以唯一分解成若干个素数的乘积。编写程序,从控制台读入一组大于 1 的整数(小于等于 20 个,且每个整数的大小不会超过 int 数据类型表示的范围),求这些整数分解成素数的最小集。该最小素数集是所有整数分解成的素数的并集(若输入的整数是素数,则该素数可以直接加入最小素数集),并且重复的素数只保留一个。按从小到大的顺序输出求得的最小素数集。
【输入形式】
先从控制台输入整数的个数,然后在下一行输入所有整数,各整数之间以一个空格分隔。
【输出形式】
在标准输出上按从小到大顺序输出求得的最小素数集,各素数之间以一个空格分隔,最后一个整数后也可以有一个空格。
【输入样例】
8
13 20 200 3456650 687 12308760 7 131
【输出样例】
2 3 5 7 13 29 131 229 257 269
#include <iostream>
#include <math.h>
using namespace std;
int isPrimeNumber(int n)
{
int flag = 1;
for (int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
{
flag = 0;
break;
}
}
return flag;
}
void decompose(int data, int arr[])
{
int i = 2;
while (data > 1)
{
if (data % i == 0)
{
arr[i] = 1;
while (data % i == 0)
data /= i;
}
i++;
}
}
int main()
{
int result[1000] = {0};
int n;
cin >> n;
long num[n];
for (int i = 0; i < n; i++)
cin >> num[i];
int x;
for (int i = 0; i < n; i++)
{
x = num[i];
if (isPrimeNumber(x))
result[x] = 1;
else
decompose(x, result);
}
for (int i = 0; i < 1000; i++)
if (result[i] == 1)
cout << i << " ";
return 0;
}
# 评论交流
最后,如果你觉得笔记对你有帮助,不妨赞赏一杯可乐😅
QQ 交流群 217394861