题目描述
任意一个四位正整数(4位数字相同者除外), 将各位数字组成一个最大数和最小数,两数相减并重复这一过程必得6174。
输入格式
输入一个四位正整数。
输出格式
输出文件包含多行, 组成一个最大数和一个最小数就输出一行,直道结果为6174。
样例
输入数据 1
4123
输出数据 1
4321-1234=3087
8730-378=8352
8532-2358=6174
那就做一个函数专门拆解整数,得到最大数和最小数,然后不断按照规则循环,直到获得6174
#include <stdio.h>
void func(int n,int *max,int *min)
{
int a[4],i,j,t;
a[0] = n/1000;
a[1] = n%1000/100;
a[2] = n%100/10;
a[3] = n%10;
for(i=0;i<3;i++)
for(j=0;j<3-i;j++)
{
if(a[j] < a[j+1])
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
*max = 0;
for(i=0;i<4;i++)
*max = *max * 10 + a[i];
*min = 0;
for(i=3;i>=0;i--)
*min = *min * 10 + a[i];
}
int main()
{
int n,max,min;
scanf("%d",&n);
while(n!=6174)
{
func(n,&max,&min);
printf("%d-%d=%d\n",max,min,max-min);
n=max-min;
}
return 0;
}
先诸位拆出各位数字,然后排序,重新组合成最大数和最小数,计算差,直到结果为6174
运行结果:
代码:
#include <stdio.h>
void bubblesort(int a[], int n)
{
int i, j, t;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (a[j] > a[j + 1]) //从小到大排序
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}
int main()
{
int a[4];
int max, min;
int n, i = 0, j;
int res ;
scanf("%d", &n); //读取n
res = n;
while (res != 6174)
{
i = 0;
//得到各位数字
while (n)
{
a[i] = n % 10;
n /= 10;
i++;
}
//排序
bubblesort(a, 4);
//得到最大数和最小数
min = 0;
for (i = 0; i < 4; i++)
min = min * 10 + a[i];
max = 0;
for (j = 3; j >= 0; j--)
max = max * 10 + a[j];
if (max == min)
{
printf("四位数字相等,不符合要求!\n");
return 0;
}
res = max - min;
printf("%d-%d=%d\n", max, min, res);
n = res;
}
return 0;
}
输入一行一个正整数n。
输出第一行一个正整数,表示得到一个回文数的最少变换次数。
接下来一行,输出变换过程,相邻的数之间用"—>"连接。输出格式可以参见样例。
保证最后生成的数在int范围内。
349
3
349--->1292--->4213--->7337
#include <stdio.h>
#include <math.h>
int isPalindrome(int x) //如果传入的正整数是回文数则返回1,否则返回0
{
if (x < 0) return 0;
else if (x == 0) return 1;
else
{
int i = 0, j = 0, a[100] = { 0 };
while (x > 0)
{
a[i] = x % 10;
i++;
x = x / 10;
}
for (j = 0; j <= (i - 1) / 2; j++)
{
if (a[j] != a[i - 1 - j]) return 0;
}
return 1;
}
}
int fz(int x) //返回翻转后的正整数
{
int a[100] = { 0 }, i = 0, y = 0, j = 0;
while (x > 0)
{
a[i] = x % 10;
i++;
x = x / 10;
}
i--;
for (j = 0; j <= i; j++)
{
y += a[j] * pow(10, i - j);
}
return y;
}
int main(void)
{
int k = 0, i = 0, a[100] = { 0 }, j = 0;
scanf("%d", &k);
while (isPalindrome(k) == 0)
{
a[i] = k;
k += fz(k);
i++;
}
printf("%d\n", i);
for (j = 0; j < i; j++)
{
printf("%d--->", a[j]);
}
printf("%d", k);
return 0;
}