E:取位数
题目描述
本题为代码补全填空题,请将题目中给出的源代码补全,并复制到右侧代码框中,选择对应的编译语言(C/Java)后进行提交。若题目中给出的源代码语言不唯一,则只需选择其一进行补全提交即可。复制后需将源代码中填空部分的下划线删掉,填上你的答案。提交后若未能通过,除考虑填空部分出错外,还需注意是否因在复制后有改动非填空部分产生错误。
求1个整数的第k位数字有很多种方法。 以下的方法就是一种。
请仔细分析源码,填写划线部分缺少的内容。
源代码
C
#include <stdio.h> // 求x用10进制表示时的数位长度 int len(int x){ if(x<10) return 1; return len(x/10)+1; } // 取x的第k位数字 int f(int x, int k){ if(len(x)-k==0) return x%10; return _____________________; //填空 } int main() { int x = 23574; printf("%d\n", f(x,3)); printf("%d\n", f(893275,2)); }
Java
import java.util.*; public class Main { static int len(int x){ if(x<10) return 1; return len(x/10)+1; } // 取x的第k位数字 static int f(int x, int k){ if(len(x)-k==0) return x%10; return ______________________; //填空 } public static void main(String[] args) { int x = 23513; //System.out.println(len(x)); System.out.println(f(x,3)); System.out.println(f(893275,2)); } }
运行限制
最大运行时间:1s
最大运行内存: 256M
#include <stdio.h> // 求x用10进制表示时的数位长度 int len(int x){ if(x<10) return 1; return len(x/10)+1; } // 取x的第k位数字 int f(int x, int k){ if(len(x)-k==0) return x%10; return f(x/10,k); //填空 } int main() { int x = 23574; printf("%d\n", f(x,3)); printf("%d\n", f(893275,2)); }
F:最大公共子串
题目描述
本题为代码补全填空题,请将题目中给出的源代码补全,并复制到右侧代码框中,选择对应的编译语言(C/Java)后进行提交。若题目中给出的源代码语言不唯一,则只需选择其一进行补全提交即可。复制后需将源代码中填空部分的下划线删掉,填上你的答案。提交后若未能通过,除考虑填空部分出错外,还需注意是否因在复制后有改动非填空部分产生错误。
最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少。
比如:"abcdkkk" 和 "baabcdadabc", 可以找到的最长的公共子串是"abcd",所以最大公共子串长度为 4。
下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。
请分析该解法的思路,并补全划线部分缺失的代码。
源代码
C
#include <stdio.h> #include <string.h> #define N 256 int f(const char* s1, const char* s2) { int a[N][N]; int len1 = strlen(s1); int len2 = strlen(s2); int i,j; memset(a,0,sizeof(int)*N*N); int max = 0; for(i=1; i<=len1; i++){ for(j=1; j<=len2; j++){ if(s1[i-1]==s2[j-1]) { a[i][j] = __________________________; if(a[i][j] > max) max = a[i][j]; } } } return max; } int main() { printf("%d\n", f("abcdkkk", "baabcdadabc")); printf("%d\n", f("aaakkkabababa", "baabababcdadabc")); printf("%d\n", f("abccbaacbcca", "ccccbbbbbaaaa")); printf("%d\n", f("abcd", "xyz")); printf("%d\n", f("ab", "ab")); return 0; }
Java
import java.util.Scanner; public class Main { static int f(String s1, String s2) { char[] c1 = s1.toCharArray(); char[] c2 = s2.toCharArray(); int[][] a = new int[c1.length+1][c2.length+1]; int max = 0; for(int i=1; i<a.length; i++){ for(int j=1; j<a[i].length; j++){ if(c1[i-1]==c2[j-1]) { a[i][j] = __________________________; if(a[i][j] > max) max = a[i][j]; } } } return max; } public static void main(String[] args){ int n = f("abcdkkk", "baabcdadabc"); System.out.println(n); System.out.println(f("aaakkkabababa", "baabababcdadabc")); System.out.println(f("abccbaacbcca", "ccccbbbbbaaaa")); System.out.println(f("abcd", "xyz")); System.out.println(f("ab", "ab")); } }
运行限制
最大运行时间:1s
最大运行内存: 256M
矩阵法求最大公共子串,对角线才是连续的子串,因此只需在上一个对角线加一就可以了
#include <stdio.h> #include <string.h> #define N 256 int f(const char* s1, const char* s2) { int a[N][N]; int len1 = strlen(s1); int len2 = strlen(s2); int i,j; memset(a,0,sizeof(int)*N*N); int max = 0; for(i=1; i<=len1; i++){ for(j=1; j<=len2; j++){ if(s1[i-1]==s2[j-1]) { a[i][j] =a[i-1][j-1]+1; if(a[i][j] > max) max = a[i][j]; } } } return max; } int main() { printf("%d\n", f("abcdkkk", "baabcdadabc")); printf("%d\n", f("aaakkkabababa", "baabababcdadabc")); printf("%d\n", f("abccbaacbcca", "ccccbbbbbaaaa")); printf("%d\n", f("abcd", "xyz")); printf("%d\n", f("ab", "ab")); return 0; }
G:日期问题
题目描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。
更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
比如 02/03/04,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日或 2004 年 03 月 02 日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
输入描述
一个日期,格式是 "AA/BB/CC" (0≤A,B,C≤9)。
输出描述
输出若干个不相同的日期,每个日期一行,格式是 "yyyy-MM-dd"。多个日期按从早到晚排列。
输入输出样例
示例
输入
02/03/04
输出
2002-03-04 2004-02-03 2004-03-02
运行限制
最大运行时间:1s
最大运行内存: 256M
#include <iostream> #include <algorithm> #include <stdio.h> using namespace std; int month12[12]={31,28,31,30,31,30,31,31,30,31,30,31}; char sum[10][10]; bool check(int y,int m,int d){ if(y%400==0 || (y%100!=0 && y%4==0)){ month12[1]=29; }else{ month12[1]=28; } if(m>=1 && m<=12 && d>=1 && d<=month12[m-1]){ return true; }else{ return false; } } string dayin(int y,int x,int d){ char ans[11]; string a; if(check(y,x,d)){ if(y>=60){ sprintf(ans,"19%02d-%02d-%02d\n",y,x,d); a=ans; }else{ sprintf(ans,"20%02d-%02d-%02d\n",y,x,d); a=ans; } } return a; } string a; string ans[3]; int s[3]; int main() { cin>>a; s[0]=(a[0]-'0')*10+(a[1]-'0'); s[1]=(a[3]-'0')*10+(a[4]-'0'); s[2]=(a[6]-'0')*10+(a[7]-'0'); ans[0]=dayin(s[0],s[1],s[2]); ans[1]=dayin(s[2],s[0],s[1]); ans[2]=dayin(s[2],s[1],s[0]); sort(ans,ans+3); for(int i=0;i<3;i++){ if(ans[i].size()>7){ if(ans[i]==ans[i+1] && i<=2){ continue; } cout<<ans[i]; } } return 0; }