算法开胃小菜
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;
以上是关于算法开胃小菜的主要内容,如果未能解决你的问题,请参考以下文章