2022-1-17

代码填空一:取数位

题目描述

本题为代码补全填空题,请将题目中给出的源代码补全,并复制到右侧代码框中,选择对应的编译语言(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时,要注意!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值