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