程序开发实训 【专题七】 数学求解(基础)


2020-05-26 作业笔记 程序开发实训

包含题目

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

Last Updated: 5/30/2020, 10:01:03 AM