算法开胃小菜

Posted 孙中明

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法开胃小菜相关的知识,希望对你有一定的参考价值。

开胃小菜

简单查找

害死人不偿命的3n+1

#include<stdio.h>
#include<iostream> 
using namespace std;
int i=0; 
int Callatz(int x)
    if(x==1)

    else if(x%2==0)
        Callatz(x/2);
        i++; 
    else
        Callatz((3*x+1)/2);
        i++; 
     
    return i; 
 
int main()
    int x;
    cin >>x;
    cout <<Callatz(x);
    return 0;

挖掘机技术哪家强?

6
3 65
2 80
1 100
2 70
3 40
3 0

输出样例:

2 150
#include <stdio.h>
#include<iostream> 
using namespace std;
//初始化 
int school[100000]=0;

int main()
    int n,id,score;
    //输入参赛人数 
    cin >>n; 
    //相同的id学校成绩相加 
    for(int i=1;i<=n;i++)
        cin >>id >>score; 
        school[id]+=score;
    
    //遍历出最大成绩
    //注意max 的初始化不要设置为0 
    int k=-1,max=-1;
    for(int i=1;i<=n;i++)
        if(school[i]>max)
            max=school[i];
            k=i;          
        
    
    cout <<k<<" "<<max; 
    return 0;

图形输出

输入在一行中给出正方形边长N(3<=N<=20)和组成正方形边的某种字符C,间隔一个空格。

输出由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。

10 a
aaaaaaaaaa
a        a
a        a
a        a
aaaaaaaaaa
#include <stdio.h>
#include<iostream> 
using namespace std;
int main()
    //定义参数 行列
    int row,col;
    char c;
    cin >>col>>c;
    //判断行列大小
    if(col%2==0)
        row=col/2;
    else
        row=col/2+1;
    
    //第一行
    for(int i=0;i<col;i++)
        cout<<c;
    
    cout<<endl;
    //第二行到倒数第二行
    for(int i=2;i<row;i++)
        cout<<c;
        for(int j=0;j<col-2;j++)
            cout<<" ";
        
        cout<<c<<endl;
    
    //最后一行
    for(int i=0;i<col;i++)
        cout<<c;
    
    cout<<endl;

日期处理

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。

有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

每组数据输出一行,即日期差值

20130101 

20130105
5
#include<cstdio>
int month[13][2] =     
    // 平年和闰年的每个月的天数 
    0,0,//仅用于填充month[0][0] 无实际意义 
    31,31,//1月 
    28,29,
    31,31,
    30,30,
    31,31,
    30,30,
    31,31, 
    31,31,
    30,30,
    31,31,
    30,30,
    31,31//12月 
;

bool isLeap(int year)  //判断是否是闰年 
    return(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);


int main()
    int time1, y1, m1, d1;
    int time2, y2, m2, d2;
    while(scanf("%d%d", &time1, &time2) != EOF)
        if(time1 > time2)
            int temp = time1;
            time1 = time2;
            time2 = temp;
        
        y1 = time1 / 10000, m1 = time1 % 10000 / 100, d1 = time1 % 100;
        y2 = time2 / 10000, m2 = time2 % 10000 / 100, d2 = time2 % 100;
        int ans = 1;        //记录结果

        //第一个日期没有达到第二个日期时进行循环
        //即 !((y1 == y2) && (m1 == m2) && (d1 = d2))
        while(y1 < y2 || m1 < m2 || d1 < d2)

            d1++;           //天数加 1

            if(d1 == month[m1][isLeap(y1)] + 1)    //满当月天数
                m1 ++;      //日期变为下个月的 1 号
                d1 = 1; 
             

            if(m1 == 13)   //月份满 12 个月
                y1++;
                m1 = 1; 
            
            ans++;          //累计 
         
        printf("%d\\n", ans);    //输出结果 
    
    return 0;

进制转换

输入两个非负10进制整数A和B(<=230-1),输出A+B的D (1 < D <= 10)进制数。

输入在一行中依次给出3个整数A、B和D。

输出A+B的D进制数。

123 456 8

1103

#include<cstdio>
int main()
    int a, b, d;
    scanf("%d%d%d", &a, &b, &d);
    int sum = a + b;
    int ans[31], num = 0;   // ans 存放 D 进制的每一位

    do     // 进制转换 
        ans[num++] = sum % d;
        sum /= d;
     while(sum != 0);

    for(int i = num - 1; i >= 0; i--)  //从高位到低位进行输出 
        printf("%d", ans[i]);
    
    return 0;
 

字符串处理

读入一串字符,判断是否是回文串。“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。

一行字符串,长度不超过255。

如果是回文串,输出“YES”,否则输出“NO”。

12321

YES


#include<cstdio>
#include<cstring>
const int maxn=256;
bool Judge(char character[])

    int lenth=strlen(character);
    for(int i=0;i<lenth/2;i++)
    
        //数组折中,i对应max-i-1 
        if(character[i]!=character[lenth-1-i])
            return false;   
    
    return true;

int main()
   
    char character[maxn];
    while(gets(character))
    
        bool flag=Judge(character);
        if(flag==true)
        
            printf("%s","YES\\n");
            return 0;
        
            else
        
            printf("%s","NO\\n");
            return 0;   
        
    
    return 0;

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。

每个测试用例的输出占一行,输出倒序后的句子。

Hello World Here I Come

Come I Here World Hello

#include<cstdio>
int main()
    int num = 0;    //单词的个数
    char ans[80][80];
    while(scanf("%s", ans[num]) != EOF)    //一直输入直到文件末尾
        num++;      //单词的个数加 1 
    
    for(int i = num - 1; i >= 0; i--)      //倒着输出单词
        printf("%s", ans[i]);
        if(i > 0) printf(" "); 
    
    return 0;
 

以上是关于算法开胃小菜的主要内容,如果未能解决你的问题,请参考以下文章

算法与数据结构开篇——基础与心得

仅在字符串末尾匹配整个句子

深度学习的开胃菜——常用的机器学习知识梳理

PAT算法题C++实现(Basic)1009 说反话 (20 分)

限界上下文

hbase架构