求助!0分,#1本地能过,数据读取有问题,但不知道在哪
  • 板块P1106 删数问题
  • 楼主Qing_
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/1/9 06:08
  • 上次更新2023/10/24 05:05:57
查看原帖
求助!0分,#1本地能过,数据读取有问题,但不知道在哪
698611
Qing_楼主2023/1/9 06:08

我自己写的读取代码(0分):

    int arr[251];  //输入的数字
    int res[251];  //结果数组
    int res_i=0;
    int k,n=0;
    //数据读取
    for(int i=0;i<251;i++)
    {
        char c;
        scanf("%c",&c);
        if(c==' '||c=='\n')break;
        arr[i] = c-'0';
        res[i] = 11;  //arr数组中,每位最大不会超过10
        n+=1;  //计算个数
    }
    cin>>k;

看了题解后,抄题解的读取代码(AC):

    int arr[251];  //输入的数字
    int res[251];  //结果数组
    int res_i=0;
    int n,k;
    char c[251];

    scanf("%s%d",c,&k);
    n=strlen(c);

    for(int i=0;i<n;i++) { arr[i]=c[i]-'0';res[i] = 11; }

下载了测试点1的数据:“178543 4”,本地编译器和系统给的答案都为“13”,但是提交时,测试点1提示“wrong Answer On line 1 column 1,read 9,expexted 1”,不知道为什么会输出9。

(怎么想都不应该有9哇 w(゚Д゚)w )

猜测:

  1. %c 和 %s 读取的数据有差异?
  2. 使用空格(" ")和换行("\n")作为读取结束的标志有问题?

真的非常不会处理字符和字符串,不知道是怎么回事,求大佬救命!不想每次都要抄答案才能过 o(TヘTo)

完整代码如下(修修改改很多回,可能有很多冗余,见谅):

# include <bits/stdc++.h>
using namespace std;

int main()
{
    int arr[251];  //输入的数字
    int res[251];  //结果数组
    int res_i=0;
    int n,k;
    char c[251];

    scanf("%s%d",c,&k);
    n=strlen(c);

    for(int i=0;i<n;i++) { arr[i]=c[i]-'0';res[i] = 11; }

//    int arr[251];  //输入的数字
//    int res[251];  //结果数组
//    int res_i=0;
//    int k,n=0;
//    //数据读取
//    for(int i=0;i<251;i++)
//    {
//        char c;
//        scanf("%c",&c);
//        if(c==' '||c=='\n')break;
//        arr[i] = c-'0';
//        res[i] = 11;  //arr数组中,每位最大不会超过10
//        n+=1;  //计算个数
//    }
//    cin>>k;


    k = n - k;  //期望留下k个数字
    if(k==0)return 0;
    for(int i=0;i<n;i++)  //遍历数据
    {
//        cout<<arr[i]<< " ";
        if(res_i<k)  //如果期望数据的个数没有达到,就添加
        {
//            printf("添加%d\n",arr[i]);
            res[res_i] = arr[i];
            res_i+=1;
        }
        //遍历已添加的数据,判断该数字是否小于其中的数字,如果小于并且后面的数据能够使期望数据完整,就替换(及后面)
        for(int j=0;j<res_i;j++)
        {
            if(arr[i]<res[j] && (n - i)>=(k - j))
            {
//                printf("替换第%d位的%d为%d\n",j,res[j],arr[i]);
                res[j]=arr[i];
                res_i = j+1;
                break;
            }
        }
    }
    //要返回一个正整数而不是数组拼接
    long long int r = 0;
    int flag = 0;  //前导为0的处理
    for(int i=0;i<k;i++)
    {
        while (i < k && res[i] == 0 && flag==0) { i++;flag = 1; }
        if(res[i]!=0)flag = 1;
        if(i>=k)break;
        r = r*10+res[i];
    }
    cout<<r;
    return 0;
}

2023/1/9 06:08
加载中...