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

题目描述

有一个正整数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;
}

 

posted @ 2019-09-25 19:28  扯铃-  阅读(512)  评论(0编辑  收藏  举报