一道C++的题目:假设整数序列1、2、3、.....n按字典序排序,现在给定非负整数n,在序列中找到第k个整数并输出其值。

节能主义者
  • 1
新手上路,请多包涵

我写的代码是

边城:把代码排好版更容易得到回答哦!很简单的,看看帮助就会了
#include<iostream>
using namespace std;
int num(int n)
{
    int sum = 0;
    for (; n != 0;)
    {
        sum++;
        n=n/10;
    }
    return sum;
}
int ten(int n)
{
    int mul = 1;
    for (int i = 1; i <= n; i++)
    {
        mul *= 10;
    }
    return mul;
}
bool compare(int m, int n)
{
    int q = num(m), p = num(n);
    for (; q>0 && p>0; q--,p--)
    {
        if (((m % ten(q)) / ten(q - 1)) > ((n % ten(p)) / ten(p - 1)))
        {
            return true;
            break;
        }
    }
    return false;
}
int main()
{
    int n, k;
    while (cin >> n >> k)
    {
        int* p = new int[n];
        for (int i = 0, j = 1; i < n; i++, j++)
        {
            p[i] = j;
        }
        for (int z = 0; z < n; z++)
        {
            for (int z1 = z + 1; z1 < n; z1++)
            {
                if (compare(p[z], p[z1]))
                {
                    int temp = p[z];
                    p[z] = p[z1];
                    p[z1] = temp;
                }
            }
        }
        cout << p[k - 1] << endl;
    }
}

我不清楚为什么显示的时候20会去到11的前面,我感觉在那个compare函数里11和20对比是不会返回true的,也就不会交换两数(目前只学到数组)

回复
阅读 767
1 个回答
ifuijx
  • 33

你的 compare() 写错了。你的实现里如果不大于就继续比较,其实应该当相等的时候再继续比较,大于返回 true,小于则返回 false

再说说你代码里的问题:

  • comapre() 实现里,return 语句后不需要 break,函数已经返回了;
  • 主函数里使用 new[],但没有配对的 delte[],导致了内存泄漏。

另外,compare() 的实现惯例是返回 int 值,负数表示小于,0 表示等于,正数表示大于。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏