注册 登录
编程论坛 C++教室

四位正整数

风卷浪起 发布于 2023-09-29 18:10, 691 次点击
大佬们好,我又来问问题了

H. 四位正整数

内存限制:128 MiB

时间限制:1000 ms

标准输入输出

题目类型:传统

评测方式:文本比较

题目描述

任意一个四位正整数(4位数字相同者除外), 将各位数字组成一个最大数和最小数,两数相减并重复这一过程必得6174。



输入格式

输入一个四位正整数。



输出格式

输出文件包含多行, 组成一个最大数和一个最小数就输出一行,直到结果为6174。



样例

样例输入

4123

样例输出

4321-1234=3087

8730-378=8352

8532-2358=6174

国庆作业,救急!
7 回复
#2
风卷浪起2023-09-29 18:12
想了很久,没有思路

[此贴子已经被作者于2023-9-29 19:24编辑过]

#3
风卷浪起2023-09-29 19:25
再附一道
I. 乘积根
内存限制:128 MiB
时间限制:1000 ms
标准输入输出
题目类型:传统
评测方式:文本比较
题目描述
求数字的乘积根。正整数的数字乘积这样规定:这个正整数中非零数字的乘积。例如整数999的数字乘积为999,得到729;729的数字乘积为729,得到126;126的数字乘积为126,得到12;12从数字乘积为1*2,得到2。如此反复取数字的乘积,直至得到一位数字为止。999的数字乘积根是2。编程输入一个长度不超过18位数字的正整数,输出计算数字乘积根的每一步结果。

输入格式
一个整数

输出格式
输出积根计算结果

样例
输入
3486784401
输出
3486784401
516096
1620
12
2
#4
rjsp2023-09-29 22:41
回复 楼主 风卷浪起
程序代码:
#include <stdio.h>

void swap_if_greater( unsigned* x, unsigned* y )
{
    if( *x > *y )
    {
        unsigned tp = *x;
        *x = *y;
        *y = tp;
    }
}

unsigned foo( unsigned n )
{
    unsigned a = n/1000%10;
    unsigned b = n/100%10;
    unsigned c = n/10%10;
    unsigned d = n/1%10;

    swap_if_greater( &a, &b );
    swap_if_greater( &b, &c );
    swap_if_greater( &c, &d );

    swap_if_greater( &a, &b );
    swap_if_greater( &b, &c );

    swap_if_greater( &a, &b );

    unsigned p = a*1 + b*10 + c*100 + d*1000;
    unsigned q = a*1000 + b*100 + c*10 + d*1;
    printf( "%u-%u=%u\n", q, p, p-q );
    return p-q;
}

int main( void )
{
    unsigned n;
    scanf( "%u", &n );

    for( ; n=foo(n), n!=6174; );
}

#5
rjsp2023-09-29 22:42
回复 3楼 风卷浪起
程序代码:
#include <stdio.h>

unsigned foo( unsigned n )
{
    unsigned result = 1;
    for( ; n!=0; n/=10 )
    {
        if( n%10 != 0 )
            result *= n%10;
    }
    return result;
}

int main( void )
{
    unsigned n;
    scanf( "%u", &n );

    printf( "%u\n", n );
    for( ; n>9; )
    {
        n = foo(n);
        printf( "%u\n", n );
    }
}
#6
风卷浪起2023-09-30 15:16
谢谢!
#7
风卷浪起2023-10-01 22:14
我终于做出了第一道!
#include <bits/stdc++.h>
using namespace std;
int biggest_number_4(int n)
{
    int a[4], i = 0;
    while (n != 0)
    {
        a[i] = n % 10;
        n /= 10;
        i ++;
    }
    for (int i = 0; i < 3; i ++)
    {
        for (int j = 0; j < 3; j ++)
        {
            if (a[j] < a[j+1])
            {
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
    return 1000 * a[0] + 100 * a[1] + 10 * a[2] + a[3];
}
int smallest_number_4(int n)
{
    int a[4], i = 0;
    while (n != 0)
    {
        a[i] = n % 10;
        n /= 10;
        i ++;
    }
    for (int i = 0; i < 3; i ++)
    {
        for (int j = 0; j < 3; j ++)
        {
            if (a[j] > a[j+1])
            {
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
    return 1000 * a[0] + 100 * a[1] + 10 * a[2] + a[3];
}
int main()
{
    int n, num, k;
    cin >> n;
    k = n;
    while (num != 6174)
    {
        num = biggest_number_4(k) - smallest_number_4(k);
        cout << biggest_number_4(k) << "-" << smallest_number_4(k) << "=" << num << endl;
        if (num == 6174)
        {
            break;
        }
        k = num;
    }
}
#8
风卷浪起2023-10-01 22:28
回复 5楼 rjsp
第二题为什么这么写不能得满分?试了好几个数都是对的
#include <bits/stdc++.h>
using namespace std;
int cjg(unsigned long long n) //范围是18446744073709551615
{
    unsigned long long sum = 1;
    while (n != 0)
    {
        if (n % 10 != 0)
        {
            sum *= n % 10;
        }
        n /= 10;
    }
    return sum;
}
int main()
{
    unsigned long long n;
    cin >> n;
    cout << n << endl;
    while (n >= 10)
    {
        n = cjg(n);
        cout << n << endl;
    }   
}

[此贴子已经被作者于2023-10-1 22:39编辑过]

1