永发信息网

编程高手来看一看,解一解

答案:2  悬赏:70  手机版
解决时间 2021-04-25 10:18

任意一个4位自然数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后两数相减,其差仍为一个自然数,重复进行上述运算,你会发现一个奇妙的数(该数继续运算下去会永远保持不变)。试用C++编程找出这个奇妙的数。

最佳答案

结果为6174,代码如下:

#include <iostream>


using namespace std;


void sort(int *a, int n)
{
int i, j, t;
for(i = 0; i < n - 1; ++i)
for(j = i + 1; j < n; ++j)
if(a[i] < a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}


int main()
{
int n, m, max, min, a[4];
cout << "输入一个四位数:";
cin >> n;
do
{
m = n;
a[0] = n / 1000;
a[1] = n / 100 % 10;
a[2] = n / 10 % 10;
a[3] = n % 10;
sort(a, 4);
max = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
min = a[0] + a[1] * 10 + a[2] * 100 + a[3] * 1000;
n = max - min;
} while(n != m);
cout << "这个奇妙的数是" << n << endl;
return 0;
}

全部回答

#include <stdio.h> #include <assert.h>

#define SWAP_IF_GREAT(x, y) \ do { \ if ((x) > (y)) \ { \ unsigned char t = (x); \ (x) = (y); \ (y) = t; \ } \ } while(false)

unsigned short GetStrangenessEx( unsigned char a, unsigned char b, unsigned char c, unsigned char d ) { assert(a <= b); assert(b <= c); assert(c <= d);

unsigned short min = a * 1000 + b * 100 + c * 10 + d; unsigned short max = d * 1000 + c * 100 + b * 10 + a;

unsigned short number = max - min;

unsigned char e = number % 10; number /= 10; unsigned char f = number % 10; number /= 10; unsigned char g = number % 10; number /= 10; unsigned char h = number % 10; number /= 10;

assert(0 == number);

SWAP_IF_GREAT(e, f); SWAP_IF_GREAT(e, g); SWAP_IF_GREAT(e, h); SWAP_IF_GREAT(f, g); SWAP_IF_GREAT(f, h); SWAP_IF_GREAT(g, h);

if ( (e == a) && (f == b) && (g == c) && (h == d) ) { return min; }

return GetStrangenessEx(e, f, g, h); }

unsigned short GetStrangeness( unsigned short number ) { unsigned char a = number % 10; number /= 10; unsigned char b = number % 10; number /= 10; unsigned char c = number % 10; number /= 10; unsigned char d = number % 10; number /= 10;

assert(0 == number);

SWAP_IF_GREAT(a, b); SWAP_IF_GREAT(a, c); SWAP_IF_GREAT(a, d); SWAP_IF_GREAT(b, c); SWAP_IF_GREAT(b, d); SWAP_IF_GREAT(c, d);

return GetStrangenessEx(a, b, c, d); }

int main() { printf("%d\n", GetStrangeness(1234)); return 0; }

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
从惠州汽车站坐车到深圳横岗,多少个钟,一个
游戏人生加公会有坏处吗
爱情同钱那个种重要??
宁波天一买诺基亚5700多少钞票啊?谢西
深圳华强北电子市场在中国第几大?
怎么冲钱到财付通
一条高一简单物理题~
谁现在还有QQ空间牧场资格啊,能邀请我吗?
赛尔号人物怎样升级最快啊
2012地球毁灭有科学依据吗?
求教CF问题
用什么软件可以缩短视频时间
邯郸沃尔马的招聘电话
QQ三国一套JS60成品新装备多少钱 合人民币多
全国各省计算机等级考试试题是否一样?在哪里
推荐资讯
帮忙取个好听的名字。
直系亲属间进行房产赠与,还需要缴纳契税吗?
十堰到天津沿途经过哪些车站
求最土的QQ昵称
开出租车的心得、技巧、战略。
超级QQ,Q会员
电脑老是CPU过热自动关机是什么问题?
水晶骷髅能解开2012预言吗?或者能必免灾难吗?
南职这个学校怎样
怎么赚元宝?
槐树巷地址在什么地方,想过去办事
孩子还不到两岁,今天感冒了,直流鼻涕和眼泪
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?