调换一个数的俩个数字位置,将该数最大化
调换一个数中的两个数字位置,将该数最大化。
例如:15469 输出95461
1234 输出 4231
512 输出 521
#include <stdio.h>
int main()
{
long long int n,k;
inti=0,j=0, m=0, t=0, b=0, c=0, A,B;
scanf("%lld", &n);
k=n;
while(n != 0)
{
m++; //m =数字的位数
n /= 10;
}
for(i = 0; i < m; i++)
{
A=k%10;//A数组中是倒序存入每个数字
k /= 10;
}
n=m;k=0;
for(i = 0; i < m; i++)
{
B=A; //B数组是正序存入每个数字
n--;
}
for(b = 0; b < m; b++)
{
for(i = 0; i < (m-b); i++)
{
if (B < B)
{
t = B;
B = B; //两个for语句想要实现换位,目前没办法实现
B = t;
c++;
break;
}
}
}
for(i=0; i<m; i++)
{
printf("%d", B); //输出B中每个元素
}
return 0;
} 如果有其他思路,也请各位大神告诉下。谢谢!!! 本帖最后由 jhq999 于 2021-10-1 06:50 编辑
例如:15469
先从最高位1和5469对比,把比1大5469的存起来,再对5469取最大与1交换,跳出所有循环;
如果没有比1大的,再从第二位5和469对比,把比5大的69存起来,再对比69取最大与5交换,跳出所有循环;
以此类推直到6和9对比 int main()
{
int val=856479,tmp=0,i=0,j=0,flag=0,max=0,count=0;
char ch={0};
i=0;
while(val)
{
ch=val%10;
val=val/10;
}
count=i-1;
for (i =count; i >=0; i--)
{
max=i;
j = i-1;
for ( ;j >=0; j--)
{
if (ch>ch)
{
max=j;
flag=1;
}
}
if (flag)
{
tmp=ch;
ch=ch;
ch=tmp;
break;
}
}
val=0;
for (i = count; i>=0 ; i--)
{
val*=10;
val+=ch;
}
return 0;
} #include <stdio.h>
#include <stdint.h>
static void swap(char *a, char *b) {
char temp = *a;
*a = *b; *b = temp;
}
void digits_get(char digits[], size_t *size, uint32_t value) {
*size = 0;
do {
digits[(*size)++] = (value % 10) + '0';
value /= 10;
} while(value);
}
void digits_set(const char digits[], size_t size, uint32_t *value) {
*value = 0;
for(size_t i = 0; i < size; ++i) {
*value *= 10;
*value += digits - '0';
}
}
void digits_sort(char digits[], size_t size) {
for(size_t i = 0; i < size; ++i) {
for(size_t j = i + 1; j < size; ++j) {
if(digits < digits)
swap(&digits, &digits);
}
}
}
int main(void) {
char digits;
size_t size;
uint32_t n;
scanf("%u", &n);
digits_get(digits, &size, n);
digits_sort(digits, size);
digits_set(digits, size, &n);
printf("%u\n", n);
return 0;
}
不要把所有东西都塞到 main 函数中呀
main 函数是 主函数
主函数只负责主逻辑
主逻辑是什么?
1. 用户输入一个数
2. 把这个数的各个数位提取出来
3. 对提取出来的数位排序
4. 把排好序的数位组装成一个新的数
5. 输出这个数
本帖最后由 jhq999 于 2021-10-1 09:29 编辑
人造人 发表于 2021-10-1 09:21
不要把所有东西都塞到 main 函数中呀
main 函数是 主函数
主函数只负责主逻辑
“调换一个数中的两个数字位置,将该数最大化。”只互换一次;
当然也可以先排序,然后按数位对比互换一次,然后再重新按数位输出。
感觉很麻烦
楼主的问题就是按从大到小排序的变种 jhq999 发表于 2021-10-1 09:27
“调换一个数中的两个数字位置,将该数最大化。”只互换一次;
当然也可以先排序,然后按数位对比互换 ...
“只互换一次” 是什么意思?
看这个例子,没有看出 “只互换一次” 的意思
例如:15469 输出95461
1234 输出 4231
512 输出 521
人造人 发表于 2021-10-1 09:33
“只互换一次” 是什么意思?
看这个例子,没有看出 “只互换一次” 的意思
例如:15469 输出95461
15469 输出95461 如果不是一次应该是96541 ;1和9
1234 输出 4231应该是4321;1和4
512 输出 521;1和2
jhq999 发表于 2021-10-1 09:40
15469 输出95461 如果不是一次应该是96541 ;1和9
1234 输出 4231应该是4321;1和4
512 输出 521;1 ...
明白了,感谢指出问题,^_^ #include <stdio.h>
#include <stdint.h>
static void swap(char *a, char *b) {
char temp = *a;
*a = *b; *b = temp;
}
void digits_get(char digits[], size_t *size, uint32_t value) {
*size = 0;
do {
digits[(*size)++] = (value % 10) + '0';
value /= 10;
} while(value);
}
void digits_set(const char digits[], size_t size, uint32_t *value) {
*value = 0;
for(int i = size - 1; i >= 0; --i) {
*value *= 10;
*value += digits - '0';
}
}
void digits_change(char digits[], size_t size) {
size_t max = 0, min = 0;
for(size_t i = 0; i < size; ++i) {
if(digits > digits) max = i;
if(digits < digits) min = i;
}
swap(&digits, &digits);
}
int main(void) {
char digits;
size_t size;
uint32_t n;
scanf("%u", &n);
digits_get(digits, &size, n);
digits_change(digits, size);
digits_set(digits, size, &n);
printf("%u\n", n);
return 0;
}
人造人 发表于 2021-10-1 09:54
这样还是不对,我再研究研究 本帖最后由 人造人 于 2021-10-1 10:14 编辑
这次可以了
1. 用户输入一个数
2. 把这个数的各个数位提取出来
3. 对提取出来的数位按题目要求交换
4. 把交换后的数位组装成一个新的数
5. 输出这个数
#include <stdio.h>
#include <stdint.h>
static void swap(char *a, char *b) {
char temp = *a;
*a = *b; *b = temp;
}
void digits_get(char digits[], size_t *size, uint32_t value) {
*size = 0;
do {
digits[(*size)++] = (value % 10) + '0';
value /= 10;
} while(value);
for(size_t i = 0, j = *size - 1; i < j; ++i, --j) \
swap(&digits, &digits);
}
void digits_set(const char digits[], size_t size, uint32_t *value) {
*value = 0;
for(size_t i = 0; i < size; ++i) {
*value *= 10;
*value += digits - '0';
}
}
void digits_swap(char digits[], size_t size) {
for(size_t i = 0; i < size; ++i) {
size_t max = i;
for(size_t j = i + 1; j < size; ++j) {
if(digits < digits) max = j;
}
if(max != i) {
swap(&digits, &digits);
return;
}
}
}
int main(void) {
char digits;
size_t size;
uint32_t n;
scanf("%u", &n);
digits_get(digits, &size, n);
digits_swap(digits, size);
digits_set(digits, size, &n);
printf("%u\n", n);
return 0;
}
人造人 发表于 2021-10-1 09:57
这样还是不对,我再研究研究
排完序更麻烦,还得记录排序之前的数位,根本不用完全排序,只需要按高数位到底数位的顺序,和它后面对比取最大,如果有比它大的取最大的,互换,退出过程,否则继续直到最后两位结束 jhq999 发表于 2021-10-1 10:17
排完序更麻烦,还得记录排序之前的数位,根本不用完全排序,只需要按高数位到底数位的顺序,和它后面对 ...
嗯,我改好了,你可以看看,应该是没问题了
人造人 发表于 2021-10-1 10:19
嗯,我改好了,你可以看看,应该是没问题了
我看没有问题了,测了3数 谢谢各位 谢谢!! 人造人 发表于 2021-10-1 10:12
这次可以了
1. 用户输入一个数
2. 把这个数的各个数位提取出来
打扰问下 如果是12222,好像没办法正确输出22221 霁清d 发表于 2021-10-2 00:08
打扰问下 如果是12222,好像没办法正确输出22221
#include <stdio.h>
#include <stdint.h>
static void swap(char *a, char *b) {
char temp = *a;
*a = *b; *b = temp;
}
void digits_get(char digits[], size_t *size, uint32_t value) {
*size = 0;
do {
digits[(*size)++] = (value % 10) + '0';
value /= 10;
} while(value);
for(size_t i = 0, j = *size - 1; i < j; ++i, --j) \
swap(&digits, &digits);
}
void digits_set(const char digits[], size_t size, uint32_t *value) {
*value = 0;
for(size_t i = 0; i < size; ++i) {
*value *= 10;
*value += digits - '0';
}
}
void digits_swap(char digits[], size_t size) {
for(size_t i = 0; i < size; ++i) {
size_t max = i;
for(size_t j = i + 1; j < size; ++j) {
//if(digits < digits) max = j;
if(digits <= digits) max = j;
}
if(max != i) {
swap(&digits, &digits);
return;
}
}
}
int main(void) {
char digits;
size_t size;
uint32_t n;
scanf("%u", &n);
digits_get(digits, &size, n);
digits_swap(digits, size);
digits_set(digits, size, &n);
printf("%u\n", n);
return 0;
}
人造人 发表于 2021-10-2 09:09
谢谢 !!{:10_302:}
页:
[1]