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,这里很多人没想明白。如果仅有前面那个条件是会出现错误解的!!