我必须编写一个程序来查找每个数字(0除外),这些数字可以用2-9中的数字来计算。 例如,首先这样的数字将是数字2520,因为它可以被从2到9的每个数字除以。 它也必须是一个只包含其自身数字类型的数字(数字中没有多个数字)。因此,例如2520将不满足此要求,因为存在两个相同的数字(2)。满足这两个要求的数字的例子是7560号。这就是我不知道如何做到这一点。我正在考虑将数组中的值转换为字符串,然后将此字符串放在另一个数组中,以便每个数字都由一个数组条目表示。
#include <stdio.h>
#include <math.h>
int main() {
int i, n, x, flag, y = 0;
scanf("%d", &n);
double z = pow(10, n) - 1;
int array[(int)z];
for (i = 0; i <= z; i++) {
flag = 0;
array[i] = i;
if (i > 0) {
for (x = 2; x <= 9; x++) {
if (array[i] % x != 0) {
flag = 1;
}
}
if (flag == 0) {
y = 1;
printf("%d\n", array[i]);
}
}
}
if (y == 0) {
printf("not exist");
}
return 0;
}
答案 0 :(得分:2)
这应该给你一个基础:
#include <stdio.h>
#include <string.h>
int main()
{
char snumber[20];
int number = 11235;
printf("Number = %d\n\n", number);
sprintf(snumber, "%d", number);
int histogram[10] = { 0 };
int len = strlen(snumber);
for (int i = 0; i < len; i++)
{
histogram[snumber[i] - '0']++;
}
for (int i = 0; i < 10; i++)
{
if (histogram[i] != 0)
printf("%d occurs %d times\n", i, histogram[i]);
}
}
输出:
Number = 11235
1 occurs 2 times
2 occurs 1 times
3 occurs 1 times
5 occurs 1 times
答案 1 :(得分:1)
那段代码很乱。让我们把它包起来。
定理:除以2到9范围内所有数字的任何数字都是a 2520的倍数。
因此,您的算法采用
形式for (long i = 2520; i <= 9876543210 /*Beyond this there must be a duplicate*/; i += 2520){
// ToDo - reject if `i` contains one or more of the same digit.
}
对于ToDo
部分,请参阅How to write a code to detect duplicate digits of any given number in C++?。当然,它是C ++,但接受的答案是逐字逐句的。
答案 2 :(得分:0)
如果我理解正确,你的问题是你需要确定一个数字是否由多个数字组成。 按照您提出的方法,将数字转换为字符串并使用数组来表示数字,我可以为实现它的函数建议以下解决方案。 main函数用于测试has_repeated_digits函数。它只是展示了一种方法。 您可以更改它并在代码中使用它。
#include <stdio.h>
#define MAX_DIGITS_IN_NUM 20
//returns 1 when there are repeated digits, 0 otherwise
int has_repeated_digits(int num){
// in array, array[0] represents how many times the '0' is found
// array[1], how many times '1' is found etc...
int array[10] = {0,0,0,0,0,0,0,0,0,0};
char num_string[MAX_DIGITS_IN_NUM];
//converts the number to string and stores it in num_string
sprintf(num_string, "%d", num);
int i = 0;
while (num_string[i] != '\0'){
//if a digit is found more than one time, return 1.
if (++array[num_string[i] - '0'] >= 2){
return 1; //found repeated digit
}
i++;
}
return 0; //no repeated digits found
}
// test tha function
int main()
{
int x=0;
while (scanf("%d", &x) != EOF){
if (has_repeated_digits(x))
printf("repeated digits found!\n");
else
printf("no repeated digits\n");
}
return 0;
}
答案 3 :(得分:0)
您可以从这些评论中简化您的问题:
因此,一个简单的方法是枚举2520到9876543210的倍数,并选择没有重复数字的数字。
类型unsigned long long
保证足够大以表示要枚举的所有值,但int
和long
都不是。
以下是代码:
#include <stdio.h>
int main(void) {
unsigned long long i, n;
for (n = 2520; n <= 9876543210; n += 2520) {
int digits[10] = { 0 };
for (i = n; i != 0; i /= 10) {
if (digits[i % 10]++)
break;
}
if (i == 0)
printf("%llu\n", n);
}
return 0;
}
此程序在0.076秒内生成 13818 数字。第一个是 7560 ,最后一个 9876351240 。
数字 0 在技术上与您的约束匹配:它可以被所有非零整数整除,并且没有重复的数字。但是你明确排除了它。