Next Number with Same Set of Digits
2014-07-14 04:25
316 查看
Problem: Reorder
the digits of a number, in order to get the next number which is the least one that is greater than the input number. For example, the number 34724126 is the next number of 34722641 when reordering digits.
/* Copyleft: Ming Lin <minggr@gmail.com> */
#include <stdio.h>
void reverse(int *data, int n)
{
int *s, *e;
s = data;
e = data + (n-1);
while (s < e) {
int tmp;
tmp = *s;
*s = *e;
*e = tmp;
s++;
e--;
}
}
/*
* 34722641 -> swap 2 and 4
* 34724621 -> reverse "621"
* 34724126
*/
int least_greater_number(int *data, int n)
{
int tmp;
int i, j;
i = n-1;
tmp = data[i--];
while (i >= 0) {
if (data[i] < tmp)
break;
tmp = data[i--];
}
if (i < 0)
return 0;
j = n;
while (j--) {
if (data[j] > data[i])
break;
}
tmp = data[i];
data[i] = data[j];
data[j] = tmp;
reverse(&data[i+1], n-i-1);
return 1;
}
void print_data(int *data, int n)
{
int i;
for (i = 0; i < n; i++)
printf("%d", data[i]);
printf("\n");
}
int main()
{
int data[] = {3, 4, 7, 2, 2, 6, 4, 1};
int n = 8;
print_data(data, n);
if (least_greater_number(data, n))
print_data(data, n);
return 0;
}
the digits of a number, in order to get the next number which is the least one that is greater than the input number. For example, the number 34724126 is the next number of 34722641 when reordering digits.
/* Copyleft: Ming Lin <minggr@gmail.com> */
#include <stdio.h>
void reverse(int *data, int n)
{
int *s, *e;
s = data;
e = data + (n-1);
while (s < e) {
int tmp;
tmp = *s;
*s = *e;
*e = tmp;
s++;
e--;
}
}
/*
* 34722641 -> swap 2 and 4
* 34724621 -> reverse "621"
* 34724126
*/
int least_greater_number(int *data, int n)
{
int tmp;
int i, j;
i = n-1;
tmp = data[i--];
while (i >= 0) {
if (data[i] < tmp)
break;
tmp = data[i--];
}
if (i < 0)
return 0;
j = n;
while (j--) {
if (data[j] > data[i])
break;
}
tmp = data[i];
data[i] = data[j];
data[j] = tmp;
reverse(&data[i+1], n-i-1);
return 1;
}
void print_data(int *data, int n)
{
int i;
for (i = 0; i < n; i++)
printf("%d", data[i]);
printf("\n");
}
int main()
{
int data[] = {3, 4, 7, 2, 2, 6, 4, 1};
int n = 8;
print_data(data, n);
if (least_greater_number(data, n))
print_data(data, n);
return 0;
}
相关文章推荐
- [leetcode]31. Next Permutation -Find next greater number with same set of digits
- Find next greater number with same set of digits
- [LeetCode] Next Permutation - Next bigger number with the same set of digits
- Next higher number with same number of set bits
- [面试题] Find next higher number with same digits
- (CareerCup)Find next higher number with same digits
- Kettle解析JSON错误,We MUST have the same number of values for all paths,We can not find and data with path [$.
- Given a number,find the next higher number using the same digits in the number.
- LeetCode之Prime Number of Set Bits in Binary Representation(Kotlin)
- tomcat 大并发报错 Maximum number of threads (200) created for connector with address null and port 8080
- [置顶]The Number of set-hdu-3006
- CF 27E Number With The Given Amount Of Divisors
- CareerCup Fill the array with product of all numbers except the number in that cell
- Counting-the-number-of-set-bits-in-an-integer
- Number of permutation with K inversions
- Independent set of tree with greedy algorithm
- all objects of the same class share the same set of class methods
- java call oracle procudure setBoolean问题PLS-00306: wrong number or types of arguments in call to
- tomcat 大并发报错 Maximum number of threads (200) created for connector with address null and port 8080
- [转] Dangers of using dlsym() with RTLD_NEXT