я действительно понял вопрос означает, что в качестве ввода следует указать целое число, а не массив целых чисел:
Они задали вопрос о поиске дублирующего элемента в целочисленном значении.
Решение проблемы. В моем исходном решении основная функция была рекурсивной. Эта функция, похоже, сработала, но я не понял, что проблема требует, чтобы дублирующие цифры были взяты из младших цифр. Мое рекурсивное решение сначала удалило цифры более высокого порядка. Это означало, что для введенного ввода образца 43456
оценили до 3456
вместо желаемого 4356
.
Я переработал функцию remove_dups()
, чтобы удовлетворить это требование. Он больше не рекурсивный. Функция создает новый номер, потребляя входной номер, беря цифру наивысшего порядка и комбинируя ее с цифрой наивысшего порядка оставшихся цифр после удаления дубликатов.
Используются три вспомогательные функции. Функция remove_digits()
используется для удаления всех вхождений цифры из числа. Функции и remove_place()
используются для получения цифры в данном месте, где место представлено 1, 10, 100, ... и для удаления цифры из заданного места соответственно.
Вот пример того, как работает функция get_place()
:
get_place(1234, 100) --> (1234 % (10 * 100) - 1234 % 100)/100
--> (1234 % 1000 - 1234 % 100)/100
--> (234 - 34)/100
--> 200/100
--> 2
И пример того, как работает функция remove_place()
:
remove_place(1234, 100) --> (1234/(10 * 100)) * 100 + 1234 % 100
--> (1234/1000) * 100 + 34
--> 1 * 100 + 34
--> 100 + 34
--> 134
Update
Код, который я первоначально отправил не обрабатывали отрицательные числа. Это связано с тем, что, когда я первоначально тестировал отрицательные числа, результаты были неверными. В этой сломанной версии я использовал значения long
в функциях, за исключением параметров plc
, которые были unsigned long
. Я ошибочно предположил, что эта проблема связана с оператором модуля, и просто изменила все на unsigned
. Казалось, что было бы достаточно просто преобразовать желаемое отрицательное число в положительное, а затем умножить результат на -1. Вот прототипы функций для оригинального, сломанного кода:
long get_place(long num, unsigned long plc);
long remove_place(long num, unsigned long plc);
long remove_digits(long num, long d);
long remove_dups(long num);
Но дальнейшее рассмотрение показал, что исходная задача была о том, что unsigned long
значение не может быть преобразовано в значение long
, так как есть unsigned long
значения, которые не являются представляются как значения long
. Это привело к некоторым результатам мусора в функциях get_place()
и remove_place()
. Изменение всего до unsigned long
разрешило эту проблему за счет исключения отрицательных входных значений. Но, с лучшим пониманием проблемы, я изменил все параметры функции и возвращаемые значения на тип long
. Это устраняет проблему и позволяет корректно обрабатывать отрицательные входные значения.
Вот код:
#include <stdio.h>
long get_place(long num, long plc);
long remove_place(long num, long plc);
long remove_digits(long num, long d);
long remove_dups(long num);
int main(void)
{
long number;
printf("Enter a number (q to quit): ");
while (scanf("%ld", &number) == 1) {
printf("%ld\n", remove_dups(number));
printf("Enter a number (q to quit): ");
}
return 0;
}
/* return digit at plc = 1, 10, 100, ... */
long get_place(long num, long plc)
{
return (num % (10 * plc) - num % plc)/plc;
}
/* remove digit at plc = 1, 10, 100, ..., and return result */
long remove_place(long num, long plc)
{
return (num/(10 * plc)) * plc + num % plc;
}
/* remove all occurrences of d in num and return result */
long remove_digits(long num, long d)
{
long place = 1;
while (num/place) {
if (get_place(num, place) == d)
num = remove_place(num, place);
else
place *= 10;
}
return num;
}
long remove_dups(long num)
{
long result, next_digit;
long last_place = 1;
result = 0;
while (num) {
for(last_place = 1; (num/(10 * last_place)); last_place *= 10)
continue;
next_digit = get_place(num, last_place);
result = result * 10 + next_digit;
num = remove_digits((num % last_place), next_digit);
}
return result;
}
Вот некоторые пример вывода:
Enter a number (q to quit): -43456
-4356
Enter a number (q to quit): 43456
4356
Enter a number (q to quit): -12321
-123
Enter a number (q to quit): 299792458
297458
Enter a number (q to quit): 0
0
Enter a number (q to quit): 1
1
Enter a number (q to quit): -1
-1
Enter a number (q to quit): q
Если вы не можете решить это самостоятельно, возможно, вы не предназначены для этой конкретной работы. – IInspectable
Серьезно, я этого не знаю. Я хочу знать эту программу. Это только я спрашиваю об этом. – Meena
Петля через ваш вход. На каждое целое число повторяется в начале ввода до тех пор, пока вы не найдете одно и то же целое число (не печатайте его в этом случае), или вы достигнете начала (напечатайте целое число). – IInspectable