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

[求助]c++如何做这道题?

cy20070818 发布于 2020-02-16 19:57, 1877 次点击
题目背景
一串数字也可以进行加密操作,如果我们知道加密之后的密码,我能找到原来的原码吗?

题目描述
给定1~n不同的n个正整数,我们知道,每个数之前会出现有几个比它小的数, 例如:n=5
1 4 2 5 3 数列中的5前面有三个比它小的数,1、4、2,我就对应在第四位编码为3,再如数列中的2,前面有一个比它小的数1,我们就对应第三位编码为1,当然第一位不论如何,都没有前面的数,我们就将第一位编码为0。那么整个数列的编码就是0 1 1 3 2,如果我们现在知道这个编码,想请你帮忙找到原数列是什么样子的,原数列里面的数字都是不同的,是由1~n组成的哦!

输入格式
两行,第一行一个正整数n,第二行n个整数(中间使用空格隔开)

输出格式
一行n个正整数,表示原数列

输入输出样例
输入 #1复制
5
0  1  1  3  2
输出 #1复制
1 4 2 5 3
说明/提示
数据范围: 80%的数据 n<=10 100%的数据 n<=30
9 回复
#2
xianfajushi2020-02-16 23:23
12345--1245--124--14--1
    int a[30]{0}, aa[30]{0}, n = 0, j = 0, jj = 0, js = 0; bool k = true;
    cout << "输入位数和数据:"; cin >> n; while (j < n)cin >> aa[j], a[j] = j++ + 1; --j;
#3
xianfajushi2020-02-16 23:34
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2020-2-17 00:56编辑过]

#4
xianfajushi2020-02-16 23:34
上面大概实现思路,给的数据太少,要有其他的数据来测试,程序有优化的需要。
12345
14253-01132
13524-01213
25341-01120
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2020-2-17 13:38编辑过]

#5
叶纤2020-02-17 14:08
用密钥推导出原密码?那要安全局干嘛啊,那不是随时可以破解的吗?
不同密码可以生成相同的密钥
14253密钥是01132
25364的密钥也是01132
#6
叶纤2020-02-17 14:24
还有1   如果你出发点只是要做题,那我告诉你这不是一道题而是一个坑
        2    如果你希望通过码源破解别人的密码?这种违法的事还是少干,因为这是借别人的手去干违法的事
#7
xianfajushi2020-02-17 17:10
192837465-011223344
975312468-000001357
只有本站会员才能查看附件,请 登录
#8
xianfajushi2020-02-17 17:10
25374819 12 13 10 14 6 11-0 1 1 3 2 5 0 7 8 9 8 11 5 10
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2020-2-17 17:21编辑过]

#9
rjsp2020-02-18 11:21
程序代码:
#include <cstdio>

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

    unsigned arr[30] = { 1 };
    for( unsigned i=1; i!=n; ++i )
    {
        unsigned a;
        scanf( "%u", &a );
        arr[i] = a+1;

        for( unsigned j=0; j!=i; ++j )
            if( arr[j] > a )
                ++arr[j];
    }

    for( unsigned i=0; i!=n; ++i )
        printf( "%u%c", arr[i], " \n"[i+1==n] );
}
#10
xianfajushi2020-02-18 18:19
循环与运算次数多,数组使用少,初始1,且从读开始+1为第2位,循环数组遇到大于输入则+1运算数值以达到小于的次数逻辑,随着数据量的增大循环和运算次数更大。

[此贴子已经被作者于2020-2-19 04:19编辑过]

1