while(scanf("%s",s1[n].s)!=EOF)
时间: 2023-12-05 17:41:50 浏览: 190
这段代码是一个while循环,每次循环通过scanf()函数读取一个字符串并存储在s1[n].s中,直到读取到文件结束符EOF为止。scanf()函数是C语言中的输入函数,用于从标准输入流中读取数据。当读取到字符串时,会将其存储在指定的变量中。在这里,%s是scanf()函数的格式控制符,表示读取一个字符串。当读取到EOF时,scanf()函数返回-1,循环结束。
相关问题
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int max(int a, int b){ return a > b?a:b; } char s1[5001], s2[5001]; int n; int len = 0; int f[2][5001]; int maxx = 0; int main(){ while(scanf("%d", &n)!=EOF){ memset(s1, 0, sizeof(s1)); memset(s2, 0, sizeof(s2)); maxx = 0; scanf("%s", s1); int k = 0; for(int i = n-1; i >= 0; i--){ s2[n-1-i] = s1[i]; } memset(f, 0, sizeof(f)); for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ if(s1[i-1] == s2[j-1]) f[i%2][j] = f[(i-1)%2][j-1]+1; else f[i%2][j] = max(f[(i-1)%2][j],f[i%2][j-1]); } } cout << n-f[n%2][n] <<endl; } }代码解释
这段代码实现了一个求解回文串最小插入次数的问题。下面是代码的解释:
首先定义了一个
max
函数,用于求两个数的最大值。int max(int a, int b){ return a > b?a:b; }
然后定义了一些变量和数组:
char s1[5001], s2[5001]; // 两个字符串 int n; // 字符串长度 int len = 0; // 最长回文子序列的长度 int f[2][5001]; // 动态规划数组 int maxx = 0; // 记录最长回文子序列的长度
接下来是主函数:
int main(){ while(scanf("%d", &n)!=EOF){ // 多组数据 memset(s1, 0, sizeof(s1)); // 初始化数组 memset(s2, 0, sizeof(s2)); maxx = 0; scanf("%s", s1); // 读入字符串 int k = 0; for(int i = n-1; i >= 0; i--){ // 将字符串反转 s2[n-1-i] = s1[i]; } memset(f, 0, sizeof(f)); // 初始化动态规划数组 for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ if(s1[i-1] == s2[j-1]) // 如果两个字符相等 f[i%2][j] = f[(i-1)%2][j-1]+1; // 最长回文子序列长度加一 else f[i%2][j] = max(f[(i-1)%2][j],f[i%2][j-1]); // 否则取左边和上面的最大值 } } cout << n-f[n%2][n] <<endl; // 输出最小插入次数 } }
对于每个输入的字符串,首先将其反转,然后用动态规划求解最长回文子序列的长度,最终输出字符串长度减去最长回文子序列的长度即为最小插入次数,使其变成回文串。
总体思路比较清晰,需要注意的是,这里用到了滚动数组技巧,将二维数组压缩成一维数组,可以减小空间复杂度。
#include<stdio.h> int HmsToS(int h, int m, int s) { int t; t=60*60*h+60*m+s; return t; } void PrintTime(int s) { int h=0,m=0; while(s>=60) { if(s>=3600) { h++; s=s-3600; } if(s<3600 && s>=60) { m++; s=s-60; } } printf("%02d:%02d:%02d\n",h,m,s); } int main() { int h,m,s,t,h1,m1,s1; while(scanf("%d:%d:%d\n",&h,&m,&s),h!=EOF); { scanf("%d:%d:%d",&h1,&m1,&s1); t=HmsToS(h1,m1,s1)-HmsToS(h,m,s); PrintTime(t); } return 0; }为什么不对
这个程序有一个小错误:
while(scanf("%d:%d:%d\n",&h,&m,&s),h!=EOF);
应该改为:
while(scanf("%d:%d:%d",&h,&m,&s) != EOF)
因为 scanf
函数返回的是读入成功的参数个数,而不是 EOF
。所以在判断是否读到文件结尾时,应该判断 scanf
的返回值是否等于 3(因为要读入三个整数)。另外注意去掉多余的分号。
阅读全文
相关推荐

















