菜鸡的代码大佬勿喷

注:不一定是最优解嗷,懒得改了/捂脸

A. 走楼梯

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

假设一段楼梯共n(0 < n < 100) 个台阶,小明一步最多能上3 个台阶。编写程序计算小明上这段楼梯一共有多少种走法。

样例解释:1、可以一步走3个台阶;2、可以先走1个台阶,然后一步走2个台阶;3、可以先走2个台阶,然后走1个台阶;4、可以每步都走1个台阶,走3步。所以共有4种走法。

输入:为一个整数n(0 < n < 100 ) 。
输出:也为一个整数,代表走法的数量。测试用例保证输入合法且所有整数均可以用long long 存储。

输入样例

3

输出样例

4

示例代码

正解(迭代):

#include <stdio.h>

int main()
{
	long long int n;
	long long int count = 0;
	scanf("%lld", &n);
	long long int a = 1, b = 2, c = 4;
	if (n == 1) 
	{
		count = 1;
	}
	else if (n == 2)
	{
		count = 2;
	}
	else if (n == 3)
	{
		count = 4;
	}
	else
	{
		long long int tmp = 0;
		for (int i = 4; i <= n; i++)
		{
			tmp = a + b + c;
			a = b;
			b = c;
			c = tmp;
		}
		count = tmp;
	}
	printf("%lld", count);
	return 0;
}

记忆化搜索(用了数组没分):

#include <stdio.h>

long long int f(long long int); 

long long int ans[102] = {0};

int main()
{
	long long int n;
	scanf("%lld", &n);
	printf("%lld", f(n)); 
	return 0;
}


long long int f(long long int i)
{
	if (ans[i] != 0)
	{
		return ans[i];
	}
	if (i == 1)
	{
		return 1; 
	}
	if (i == 2)
	{
		return 2; 
	} 
	if (i == 3)
	{
		return 4; 
	}
	else
	{
		ans[i] = f(i - 1) + f(i - 2) + f(i - 3);
		return ans[i];
	}
}

B. 分球

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

现有n个小球,要把它们分给3个人,如果每人至少分m个,问共有多少种分法。
样例解释:共有(3,3 ,6)、(3, 4 ,5)和(4,4,4)三种分法。

输入:为两个用空格分隔的整数n(1<n),m(0<m)。
输出:为一个整数,代表分法的数量。测试用例保证输入合法,分法至少有1种,且均所有整数均可以用int存储。

输入样例

12 3

输出样例

3

示例代码

#include<stdio.h>

int main()
{
	int n, m;
	scanf("%d %d", &n, &m);
	int a, b, c;
	int count = 0;
	for (a = m; a <= n - 2 * m; a++)
	{
		for (b = a; b <= n - 2 * m; b++)
		{
			for (c = b; c <= n - 2 * m; c++)
			{
				if (a + b + c == n)
				{
					count++;
				}
			}
		}
	}
	printf("%d", count);
} 

C. 逆数求和

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

整数的“逆数”指的是把该整数的每一位数字的顺序颠倒过来所得到的另一个整数。如果一个整数的末尾是以0,那么在它的逆数当中,这些0就被省略掉了。比如说,1245的逆数是 5421,而1200的逆数是21。请编写一个程序,输入两个整数,然后计算这两个整数的逆数之和sum,然后再把sum的逆数计算出来。

输入:只有一行,包括两个整数,中间用空格隔开。
输出:共三行,即相应的结果。具体格式见输出样例。测试用例保证输入合法,且所有整数均可以用int存储。

输入样例

123 456

输出样例

reverse(123)=321
reverse(456)=654
reverse(sum)=579

示例代码

#include<stdio.h>

int reverse(int);

int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	printf("reverse(%d)=%d\n", a, reverse(a));
	printf("reverse(%d)=%d\n", b, reverse(b));
	printf("reverse(sum)=%d", reverse(reverse(a) + reverse(b)));
	return 0;
} 

int reverse(int i)
{
	int n = i;
	int hou = 0;
	while (i != 0)
	{
		hou = hou * 10;
		hou = hou + i % 10;
		i = i / 10;
	}
	return hou;
}

D. 多少个一

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

给定一个整数n(0 < n < 10000 ),如果n不能被2或5整除,那么n的某个倍数一定由若干个1组成。请写程序计算出最小的这样的倍数的位数。

注意:从逻辑上讲,最小的这样的倍数是可能超过long long 的存储范围的,但我们的测试用例保证没有这样的测试数据。

样例解释:最小的这样的倍数为111。

输入:只有一整数代表n。
输出:也只有一个整数,为计算结果。

输入样例

3

输出样例

3

示例代码

#include<stdio.h>

int main()
{
	long long int n;
	scanf("%lld", &n);
	if (n % 2 != 0 && n % 5 != 0)
	{
		long long int i = 1;
		int count = 1;
		while (i % n != 0 && i > 0)
		{
			i = i * 10 + 1;
			count++;
		}
		printf("%d\n", count);
	}
	else
	{
		printf("0\n");
	}
	return 0;
} 

E. 玩游戏二

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

你正在玩某款流行游戏,在游戏中你操纵的角色从天而降,来到一个二维地图的中心。地图同生活中的地图类似也是上北下南左西右东。你可以用三个键来控制这个角色在地图上行走,你按1,角色向前走,你按2,角色向右走(同时转向右边),你按3,角色向左走(同时转向左边)。我们假设1、你每按一个数字角色在地图上行走的距离是一样的;2、你刚刚降落到地图上时是面朝西的。那么请你写一段程序来判断若干次操作后,角色所在的位置相对于出发点(角色刚刚降落到地图时的位置)位置的方位。

输入:只有一行仅由1,2或3组成的字符串(以’\n’结束),依次代表你按下的键。
输出:只有一行,为一个字母或两个字母的组合,代表最终地点相对于出发地的方位(用英文字母eswn,分别代表东南西北)。如果需要输出两个字母,则输出字母按照字典序输出,比如es代表东南。

测试用例保证合法,且没有最终又回到原始出发点的情况。

输入样例

31

输出样例

s

示例代码

#include<stdio.h>

int main()
{
	char d;
	int x = 0, y = 0;
	scanf("%c", &d);
	int state = 2; //north 1, south 3, west 2, east 4
	while (d != '\n')
	{
		if (d - '0' == 2)
		{
			state = state - 1;
		}
		if (d - '0' == 3)
		{
			state = state + 1;
		}
		while (state > 4)
		{
			state = state - 4;
		}
		while (state <= 0)
		{
			state = state + 4;
		}
		if (state == 1)
		{
			y = y + 1;
		}
		if (state == 2)
		{
			x = x - 1;
		}
		if (state == 3)
		{
			y = y - 1;
		}
		if (state == 4)
		{
			x = x + 1;
		}
		scanf("%c", &d);
	}
	if (x > 0)
	{
		if (y > 0)
		{
			printf("en");
		}
		else if (y < 0)
		{
			printf("es");
		}
		else
		{
			printf("e");
		}
	}
	else if (x < 0)
	{
		if (y > 0)
		{
			printf("nw");
		}
		else if (y < 0)
		{
			printf("sw");
		}
		else
		{
			printf("w");
		}
	}
	else if (y > 0)
	{
		printf("n");
	}
	else if (y < 0)
	{
		printf("s");
	}
	return 0;
}
分类: OJ代码