代码填空一:取数位
题目描述
本题为代码补全填空题,请将题目中给出的源代码补全,并复制到右侧代码框中,选择对应的编译语言(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 f(x/10,k); //填空
}
int main()
{
int x = 23574;
printf("%d\n", f(x,3));
printf("%d\n", f(893275,2));
}
首先也是最重要的要搞清楚第几位是顺着数还是倒着数?假设x=235,此时输出f(x,3)为5,所以3代表顺着第三个!
代码填空二:最大公共子串
题目描述
最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少。
比如:"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] = 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;
}
根据动态规划求最长公共子序列得。
编程题一:日期问题
题目描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。
小明知道这些日期都在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"。
多个日期按从早到晚排列。 (最后答案既要排序又不能重复,所以答案存在set中)
输入样例
02/03/04
输出样例
2002-03-04
2004-02-03
2004-03-02
代码实现
#include <iostream>
#include <string>
#include <sstream>
#include <set>
using namespace std;
//判断是否为闰年
bool isLeap(int year){
return (year%4==0&&year%100!=0)||(year%400==0);
}
//数字转化为字符串
void itos(int i,string &s){
stringstream ss;
ss<<i;
ss>>s;
}
//1960-1-1到2059-12-31
string f(int y,int m,int d){//判断日期是否在此范围内
//先判断年是否合法
if(y>=0&&y<=59) y+=2000;
else if(y>=60&&y<=99) y+=1900;
else return "";
//判断月是否合法
if(m<1||m>12) return "";
//判断日是否合法
if(d<1||d>31) return "";
bool flag=isLeap(y);
switch (m)
{
case 2:
if(flag==1 && d>29)return "";
if(flag==0 && d>28)return "";
break;
case 4:
if(d>30) return "";
break;
case 6:
if(d>30) return "";
break;
case 9:
if(d>30) return "";
break;
case 11:
if(d>30) return "";
break;
default:
break;
}
string a,b,c;
itos(y,a);
itos(m,b);
itos(d,c);
//补零判断
if(b.length()==1) b='0'+b;
if(c.length()==1) c='0'+c;
return a+"-"+b+"-"+c;
}
int main()
{
string s,s1,s2,s3;
set<string> ans;
cin>>s;
int y=0,m=0,d=0;
//将字符串转化为3个数字
y=(s[0]-'0')*10+(s[1]-'0');
m=(s[3]-'0')*10+(s[4]-'0');
d=(s[6]-'0')*10+(s[7]-'0');
s1=f(y,m,d);
s2=f(d,m,y);
s3=f(d,y,m);
if(s1!="") ans.insert(s1);
if(s2!="") ans.insert(s2);
if(s3!="") ans.insert(s3);
for(set<string>::iterator it=ans.begin();it!=ans.end();it++){
cout<<*it<<endl;
}
return 0;
}
#include <iostream>
using namespace std;
#include<set>
#include<sstream>
int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool isLeap(int y){
return (y%4==0&&y%100!=0)||(y%400==0);
}
void itos(int x,string &s){//引用,引用,引用!!!
stringstream ss;
ss<<x;
ss>>s;
}
string f(int y,int m,int d){
if(y>=60&&y<=99) y+=1900;
else if(y>=0&&y<=59) y+=2000;
else return "";
if(m<1||m>12) return "";
if(isLeap(y)) day[2]=29;
else day[2]=28;
if(d<1||d>31) return "";
else if(d>day[m]) return "";
else{
string a,b,c;
itos(y,a);
itos(m,b);
itos(d,c);
return a+"-"+b+"-"+c;
}
}
int main()
{
string s,s1,s2,s3;
set<string> ans;
cin>>s;
int y,m,d;
for(int i=0;i<s.length();i++){
y=(s[0]-'0')*10+(s[1]-'0');
m=(s[3]-'0')*10+(s[4]-'0');
d=(s[6]-'0')*10+(s[7]-'0');
}
s1=f(y,m,d);
s2=f(m,d,y);
s3=f(d,m,y);
if(s1!="") ans.insert(s1);
if(s2!="") ans.insert(s2);
if(s3!="") ans.insert(s3);
for(set<string>::iterator it=ans.begin();it!=ans.end();it++)
cout<<*it<<endl;
return 0;
}
!好家伙,写if--else if--else时else if没写else,直接进入函数就返回空了,一直输出不出来 !
!!!当函数中有多个if时,要注意!!!