【问题标题】:why do I get wrong answer in c code for some of the input?为什么我在某些输入的 c 代码中得到错误的答案?
【发布时间】:2016-12-23 17:58:21
【问题描述】:

这次你的任务很简单。

给定两个整数 X 和 K ,找出在 x 中最多 K 位改变数字可以形成的最大数。

输入:

输入的第一行包含两个整数 X 和 K K 由一个空格分隔。

输出:

打印单行中形成的最大数字。

约束:

1

0

代码 -

int main()
{
    long long x ;
    scanf("%llu" , &x);

    int k ;
    scanf("%d" , &k);

    long long  max = (int)log10(x) + 1 ;

    int arr[max] ;


    long long  temp = x ;
    long long  i ;
    for(i = max -1  ; i >= 0  ; i-- )
    {
        arr[i] = temp % 10 ;
        temp = temp / 10 ;
    }

    i = 0 ;
    int cnt = k ;
    while(cnt != 0)
    {
        if(arr[i] != 9)
    {
        arr[i] = 9 ;
        cnt = cnt - 1 ;
    }

    i = i + 1 ;

    }

    int power = max -1 ;
    long long answer = 0 ;
    for(i = 0 ; i < max ; i++)
    {
        answer = answer + arr[i] * pow(10,power) ;
        power = power -1 ;
    }

    printf("%llu" , answer );

    return 0;
 }

获得部分正确的输出

给定输入的错误输出 -

242358001399388784 9

169232736841900368 4

正确的输出 -

14500679550767648 1

8330936799410214 9

【问题讨论】:

  • 我自己还没有让它工作,但一方面,你正在将你的long longs 读写为 un_signed,但将它们保存到 _signed @987654323 @s 在您的代码中。这可能就是标志的来源。
  • 在 printf 中将“llu”更改为“ll”让我得到零分,甚至没有一个正确
  • 仔细查看printf 的手册。 %ll 不是格式化 long long 整数的合适方法;这只是一个精度规格。
  • 试过“lld”还是一样的结果
  • 你能提供一些带有 i/p 和 o/p 的示例测试用例吗?

标签: c implementation


【解决方案1】:

无需计算answer。您可以通过打印数组来绕过它。

#include<bits/stdc++.h>
int main()
{
long long int x ;
scanf("%lld" , &x);

int k ;
scanf("%d", &k);

long long int max = (int)log10(x) + 1 ;

int arr[max] ;


long long int  temp = x ;
long long int  i ;
for(i = max -1  ; i >= 0  ; i-- )
{
    arr[i] = temp % 10 ;
    temp = temp / 10 ;
}

i = 0 ;
int cnt = k ;
while(cnt != 0)
{
    if(arr[i] != 9)
{
    arr[i] = 9 ;
    cnt = cnt - 1 ;
}

i = i + 1 ;

}

// JUST PRINT THE ARRAY
for(i=0;i<max;i++)
    printf("%d",arr[i]);
return 0;
}

【讨论】:

  • 顺便说一句,你是 BITS PILANI 的吗?
  • @DeepakDahiya 为什么会这样?! :|
【解决方案2】:

这个程序似乎可以解决您的问题。您只需从字符串的左侧添加正确数量的 9:s。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    char *line = NULL;  /* forces getline to allocate with malloc */
    size_t len = 0;     /* ignored when line = NULL */
    ssize_t read;
    while ((read = getline(&line, &len, stdin)) != -1) {
        int loop = atoi(&(line[strlen (line) - 2]));
        for (int i = 0; i< loop; i++) {
            if (line[i] == '9')
                loop++;
            else line[i] = '9';
        }
        line[strlen(line)-2] = '\0';
        printf("%s\n", line);
    }
    free (line);
    return 0;
}

测试

 ./a.out
169232736841900368 4
999992736841900368 

【讨论】:

    猜你喜欢
    • 2021-12-25
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    相关资源
    最近更新 更多