OJ系统刷题 第六篇

13301 - 星号等腰三角形(重要题型)

时间限制 : 1 秒

内存限制 : 128 MB

输入一个正整数n,输出高为n的由*组成的等腰三角形。

输入

输入一个正整数

输出

输出高为n的由*组成的等腰三角形

样例

输入

3

输出

  *
 ***
*****

答案:

#include<iostream>
using namespace std;
int main() {
	int n;
	cin >> n;
	
	for (int i = 1; i <= n; i++) {
		//打印空格
		for (int j = 1; j <= n - i; j++) {
			cout << " ";
		}
		//打印'*'
		for (int k = 1; k <= 2 * i - 1; k++) {
			cout << '*';
		}
		cout << endl;
	}
	return 0;
}

 分析:这个题刚开始写是先想着先打印空格再打印*,但是发现这样不好编写程序,因为先打印空格的话,最后光标会停留在第n+1行,而再打印*就从第n+1行开始打印,显然这个逻辑是不对的。

这道题的精髓就是:

在一个循环里面用两个循环实现打印,一个用来打印空格,一个用来打印*。这个逻辑真的太精彩了。一般刚开始写还真不一定想得到!!

 是否通过:

 

13304 - 输出数字图形2

时间限制 : 1 秒

内存限制 : 128 MB

输入行数m,请输出满足如下规律的图形

1
23
345
4567
56789
 

若m为2,输出如上图形的前两行,

若m为3,输出如上图形的前3行。

输入

行数m

输出

m行满足规律的图形

样例

输入

2

输出

1
23

 答案:

#include<iostream>
using namespace std;
int main() {
	int m;
	cin >> m;
	for (int i = 1; i <= m; i++) {
		for (int j = i,k=1; k <= i; j++,k++) {
			cout << j;
		}
		cout << endl;
	}
	return 0;
}

分析:这个题难度一般,也不算简单,主要是找准每次循环打印的次数和打印的数据。第i行打印i个数据,但是起始数据又从i开始,因此在for循环可设置两个变量,一个用来记录初始值,一个用来控制循环次数

是否通过:

13401 - 求菲波那契数列的第n项

时间限制 : 1 秒

内存限制 : 128 MB

菲波那契(fibonacci)数(简称菲氏数)定义如下:

f(0) = 0;f(1) = 1;f(n) = f(n-1) + f(n-2);(其中:n>=2)。

求菲波那契数列第n项的值。(n从0开始计算)

输入

n(0<=n<=45)

输出

菲波那契数列第n项的值

样例

输入

3

输出

2

答案:

#include<iostream>
using namespace std;
int main() {
	int f0 = 0, f1 = 1,fn=0;
	int n;
	cin >> n;
	if (n == 0) {
		fn = 0;
	}
	else if (n == 1) {
		fn = 1;
	}
	else {
		for (int i = 2; i <= n; i++) {
			fn = f0 + f1;
			f0 = f1;
			f1 = fn;
		}
	}
	cout << fn;
	return 0;
}

 分析:这个题是非常经典的题目。斐波那契数列有多种解法,常见就是递归。但是要注意,递归求解斐波那契数列会产生大量的重复计算,浪费时间。因此我们用非递归来求解。不是说不可以用递归。

是否通过:

13403 - 角谷猜想(有点难

时间限制 : 1 秒

内存限制 : 128 MB

角谷猜想又称冰雹猜想。它首先流传于美国,不久传到欧洲,后来由一位叫角谷的日本人带到亚洲。因此被称为角谷猜想。通俗地讲,角谷猜想的内容是这样的:

任意给定一个整数n,当n是偶数时,将它除以2,即将它变成n/2;当n是奇数时,就将它变成3*n+1,……,若干步后,总会得到1。

在上述演变过程中,将每一次出现的数字排列起来,就会出现一个数字序列。

我们现在要解决的问题是:对于给定的n,求出数字序列中第一次出现1的位置。(位置从1开始编号)

输入

输入一个整数n

输出

输出序列中第一次出现1的位置

样例

输入

6

输出

9

 答案:

#include<iostream>
using namespace std;
int main() {
	int n, i = 2, count = 1;
	//count记录n变成1所经历的步数
	cin >> n;
	int a[1000];//记录每次n变化后的值
	a[1] = n;
	while (n != 1) {
		if (n % 2 == 0) {
			n /= 2;
			a[i++] = n;
			count++;
		}
		else {
			n = 3 * n + 1;
			a[i++] = n;
			count++;
		}
	}
	for (int i = 1; i <= count; i++) {
		if (a[i] == 1) {
			cout << i;
			break;
		}
	}
	return 0;
}

分析:很多人卡在这个查找1的位置,不知道要循环几次,因此我们在处理n的时候要设计一个计数器count,用来记录当n变成1的时候所经历的步数。这是本题很难的一个点。

是否通过:

 13405 - 鸡兔同笼

输入

一行 m n (1 <= m, n < 10,000,000)

输出

一行,满足条件的组合(鸡的数量在前,兔的数量在后)。若不存在则输出-1 -1

样例

输入

11 22

输出

11 0

答案: 

#include<iostream>
using namespace std;
int main() {
	int m, n;
	cin >> m >> n;
	bool flag = false;
	for (int i = 0; i <= m; i++) {
		for (int j = 0; j <= m - i; j++) {
			if (2 * i + 4 * j == n&& i + j == m) {
				cout << i << " " << j<<endl;
				flag = true;
			}
		}
	}
	if (!flag) {
		cout << -1 << " " << -1;
	}
	return 0;
}

分析:用编程的思想去列方程求解,显然是不可能的,编程没有这种解决求未知数的方法。我们可用i表示鸡的数目,j表示兔子的数目。这样当鸡有i只时,兔子有m-i只。当且晋档:

2*i+j*4==n且i+j==m时成立。

这是解鸡兔同笼的核心。为什么要使得i+j==m,这里很多人没想明白。如果仅有前面那个条件是会出现错误解的!! 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值