为什么我的某些输入在 C 代码中得到错误答案?
why do I get wrong answer in c code for some of the input?
这次你的任务很简单。
给定两个整数 X 和 K ,找出 x 中至多 K 位的数字可以改变的最大数字。
输入:
第一行输入两个整数X和K
K 由单个 space.
分隔
输出:
打印一行中形成的最大数字。
限制条件:
1 < X < 10^18
0 < K < 9
代码 -
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
无需计算 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;
}
这个程序似乎可以解决您的问题。您只需从字符串左侧添加正确数量的 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] = '[=10=]';
printf("%s\n", line);
}
free (line);
return 0;
}
测试
./a.out
169232736841900368 4
999992736841900368
这次你的任务很简单。
给定两个整数 X 和 K ,找出 x 中至多 K 位的数字可以改变的最大数字。
输入:
第一行输入两个整数X和K K 由单个 space.
分隔输出:
打印一行中形成的最大数字。
限制条件:
1 < X < 10^18
0 < K < 9
代码 -
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
无需计算 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;
}
这个程序似乎可以解决您的问题。您只需从字符串左侧添加正确数量的 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] = '[=10=]';
printf("%s\n", line);
}
free (line);
return 0;
}
测试
./a.out
169232736841900368 4
999992736841900368