Q.>输入一个字符串(大写字母)。考虑字符串中每个字符的ASCII值,并将其替换为最接近的素数,然后打印该字符串。
ex:ABCDEF
,相应的ascii是: 65,66,67,68,69,70
在用最接近的素数 67,67,67,67,67,71 替换每个值之后,它给出CCCCCG
作为输出
[注意:如果两个质数是等距的,请考虑较低(69最靠近67和71,但要考虑67)。]
#include<stdio.h>
#include<string.h>
int closestprime(int x)
{
int primes[6]={67,71,73,79,83,89},i;
for(i=0;i<6;i++)
{
if(x<primes[i])
{
if(x<=69)
return 67;
else{
if((x-primes[i-1])>(primes[i]-x))
return primes[i];
else
return primes[i-1];
}
if (x==90||x==91)
return 89;
}
}
}
int main()
{
int i,j,cases,length;
scanf("%d%d",&cases,&length);
char *str;
str=(char *)malloc((length+1)*sizeof(char));
for(j=0;j<cases;j++){
for(i=0;i<length;i++)
{
scanf("%c",str+i);
}
for(i=0;i<length;i++)
{
str[i]=(char) closestprime((int) str[i]);
printf("%c",str[i]);
}
free(str);
printf("\n");
}
return 0;
}
在这里,我的代码每次在开始时都会生成一个不需要的单个“ C”字符。输出应为SCSSCC
,它正在生成CSCSSC
。它还缺少最后一个C
。
> 1
> 6
> TESTED
> CSCSSC
答案 0 :(得分:1)
在输入字符串“ TESTED”输入后,您的程序将“ Enter”作为\n
输入到输入缓冲区。您的scanf("%c",str+i);
正在读取“ \ n”作为输入。
您需要清除输入缓冲区。
在fseek(stdin,0,SEEK_END);
之后使用scanf("%d%d",&cases,&length);
int i,j,cases,length;
scanf("%d%d",&cases,&length);
fseek(stdin,0,SEEK_END);
//.....
或者您也可以在scanf(" %c",str+i);