Проверить, являются ли все цифры данного натурального числа различными (СИ)
При вводе числа 101 или ему подобного программа выдает положительный результат, хотя должно быть наоборот
#include <stdio.h>
int power(int n, int i) {
if (i == 0)
return 1;
else
return power(n, (i - 1)) * n;
}
int Check (int n) {
int i = 1, k = (n / power(10, i)) % 10;
if (n >= 1 && n < 10)
return 1;
else
while (k != 0) {
if ((n % 10) == k) {
return 2;
break;
}
else {
i++;
k = (n / power(10, i)) % 10;
}
}
}
int main () {
long long n;
int i, j = 0, k;
scanf ("%lld", &n);
for (i = n; i >= 0; i /= 10)
if (Check(i) == 1) {
puts ("True");
break;
}
else if (Check(i) == 2) {
puts ("False");
break;
}
}
Ответы (2 шт):
Автор решения: Harry
→ Ссылка
"Зачем просто, если можно сложно?!" (с)
int checkDifferent(int n)
{
int digs[10] = {0};
for(;n;n/= 10) digs[n%10]++;
for(int i=0; i<10; ++i) if (digs[i]>1) return 0;
return 1;
}
Или даже
int check(int n)
{
for(int digs[10] = {0};n && ++digs[n%10] <= 1;n/=10);
return n == 0;
}
Автор решения: Павел Ериков
→ Ссылка
Другая версия функции, которой не обязательно по всему числу идти :)
int checkDIfferent(int n) {
bool digs[10] = { 0 };
while (n > 0) {
if (digs[n % 10])
return 0;
digs[n % 10] = true;
n /= 10;
}
return 1;
}
Специально для Harry:
int checkDIfferent(int n) {
bool digs[10] = { 0 };
for (; n && !digs[n % 10]; n /= 10) digs[n % 10] = true;
return n == 0 || !digs[n % 10];
}
А можно и так. Почему нет?:
int checkDIfferent1(int n) {
unsigned short int digs = 0;
while (n > 0) {
if (digs & (1 << (n % 10)))
return 0;
digs |= (1 << (n % 10));
n /= 10;
}
return 1;
}
Продолжение следует?...