美文网首页
算法设计与分析 1.3 杰哥和数字

算法设计与分析 1.3 杰哥和数字

作者: 阿明DunDunDun | 来源:发表于2019-11-09 13:42 被阅读0次

题目描述:

有一个正整数X,想知道有多少个满足要求的正整数D存在,要求是D是X的因子,并且D和X至少有一位相同。

输入格式:

只有一行,一个正整数X。
对于30%的数据,X<=100。
对于50%的数据,X<=200。
对于100%的数据,X<=1000000000。

输出格式:

只有一行,一个整数表示满足要求的数字D的个数。

样例输入:

10

样例输出:

2

方法一:

顺着题目思路,分两步,第一步先求所有因子,第二步和X进行比较。

#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
#define MAX 15
int x, n = 0;
int a[MAX], b[MAX]; //x拆完后存储于a,找到的因子拆完后存储于b
int split(int num, int N[]);
int isSameFigure(int xx, int ii) //判断X和它的因子是否存在相同的数字
{
    int w1, w2; // 用来存位数
    int flag = 0;
    memset(b, 0, sizeof(b));
    w1 = split(xx, a);
    w2 = split(ii, b);
    for (int i = 1; i <= w1; i++)
    {
        for (int j = 1; j <= w2; j++)
        {
            if (a[i] == b[j])
            {
                flag = 1;
                break;
            }
        }
        if (flag == 1) break;
    }
    return flag;
}

int split(int num, int N[]) // 拆数字用,每位数字是以倒序存储在数组里,从a[1]开始
{
    int numx, i = 0;
    numx = num;
    while (numx)
    {
        N[++i] = numx % 10;
        numx = numx / 10;
    }
    return i; // 返回的是待拆数字的位数
}

int main()
{
    cin >> x;
    for (int i = 1; i * i <= x; i++)
    {
        if (x % i == 0)
        {
            if (i * i == x) // 若为平方根,则判断是否有相同数字的操作只做一次,若不为平方根,则计算两次
            {
                n += isSameFigure(x, i);
            }
            else
            {
                n += isSameFigure(x, i);
                n += isSameFigure(x, x / i);
            }
        }
    }
    cout << n;

方法二:

前一步求所有因子是没法省略的,所有在第二步比较的时候优化了算法,思想是把所有出现的数字用数组存起来,如果比对再次出现那个数字,则满足条件跳出了循环。

#include<iostream>
#include<cstring>
using namespace std;
int compare(int i);
int a[9] = { 0 };

int main()
{
    int n = 0;//输入的数字
    cin >> n;
    int x = 0, i = n;//标志位
    int count = 0;//总数计数
    while (i != 0)
    {
        x = i % 10;
        i = i / 10;
        a[x] = 1;
    }

    for (i = 1; i * i <= n; i++)
    {
        if (n % i == 0)
        {
            if (i * i == n)
            {
                if (compare(i)) count++;

            }
            else
            {
                if (compare(i)) count++;
                if (compare(n / i)) count++;
            }
        }
    }
    cout << count;
}

int compare(int i)
{
    int x;
    while (i != 0)
    {
        x = i % 10;
        if (a[x] == 1) return 1;
        else i = i / 10;
    }
    return 0;
}

相关文章

  • 算法设计与分析 1.3 杰哥和数字

    题目描述: 有一个正整数X,想知道有多少个满足要求的正整数D存在,要求是D是X的因子,并且D和X至少有一位相同。 ...

  • 算法设计与分析(第3版)

    《算法设计与分析(第3版)》系统地介绍了算法设计与分析的概念和方法,共4篇内容。第1篇介绍算法设计与分析的基本概念...

  • 算法设计与分析 2.1 杰哥和序列 (求逆序数算法)

    题目描述: 杰哥喜欢单调不下降的序列,因为他觉得这样的序列有美感。 今天杰哥得到了一个长度为N的序列D,但是他今天...

  • 2018-03-05 数字旋转方阵

    【问题】 输出N*N(1《N《10)的数字旋转方阵例如下面这个: 【分析】 首先这道题是《算法设计与分析》里的例题...

  • 如何学习数据结构与算法

    算法学习经验 推荐: 入门: 数据结构启蒙:《数据结构与算法分析——C 语言描述》 算法启蒙:《算法设计与分析基础...

  • 给我巨大影响的技术书籍

    算法《算法概论》《算法设计与分析基础》 Anany Levitin《算法引论》Udi Manber《算法导论》《什...

  • 递归算法设计

    递归是程序设计中一个很重要的课题。用递归技术设计的算法简单明了。递归算法的设计与分析是算法设计与分析的一大类。 首...

  • 算法设计与分析导论

    《算法设计与分析导论》本书在介绍算法时,重点介绍用干设计算法的策略.非常与众不同。书中介绍了剪枝搜索、分摊分析、算...

  • 第一章绪论

    1.1数据结构 1.2基本概念和术语 1.3抽象数据类型 1.4算法和算法分析 给出问题--->画出逻辑结构---...

  • 算法导论学习笔记(1)

    《算法导论》一共包含两部分,即算法分析和算法设计。 什么是算法分析? “算法分析是关于计算机程序性能和资源利用的理...

网友评论

      本文标题:算法设计与分析 1.3 杰哥和数字

      本文链接:https://www.haomeiwen.com/subject/oqfnbctx.html