这次你的任务很简单。
给定两个整数X和K,找到可以通过改变数字x中最近K个位置的数字来形成的最大数字。
输入:
输入的第一行包含两个整数X和K. K由单个空格分隔。
输出:
打印一行中形成的最大数字。
约束:
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
答案 0 :(得分: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;
}
答案 1 :(得分: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] = '\0';
printf("%s\n", line);
}
free (line);
return 0;
}
测试
./a.out
169232736841900368 4
999992736841900368