目录
1.金中的蛋糕裱花
oj(循环)12
输入
一个整数,n>0。
输出
由n*2-1层“*”号组成的空心菱形。
样例输入
5
样例输出
* * * * * * * * * * * * * * * *
代码来源:
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
for (int i = 1; i <= 2 * n - 1; i++){
if (i <= n){
for (int j = 1; j <= 2 * n - 1; j++){
if (j == n - i + 1 || j == n + i - 1)cout << "*";
else cout << " ";
}
cout << endl;
}
else{
for (int g = 1; g <= 2 * n - 1; g++){
if (g == i - n + 1 || g == 3 * n - 1 - i)cout << "*";
else cout << " ";
}
cout << endl;
}
}
return 0;
}
2.求两数的最小公倍数
oj(循环)13
描述
求两个正整数的最小公倍数。
(0<n<10000,0<m<10000)
输入
一行,两个整数n和m,中间用一个空格隔开。
输出
一个整数,即n和m的最小公倍数。
样例输入
4 3
样例输出
12
思路
两数之积除以两数最大公因数
最大公约数求法
#include<iostream>
using namespace std;
int main() {
int n, m, temp, a, b;
cin >> n >> m;
a = n;
b = m;
if (n < m) {
temp = n; n = m; m = temp;
}
while (m) {
temp = m;
m =n%m;
n = temp;
}
temp = a * b / n;
cout << temp << endl;
return 0;
}
3.最短距离的点
oj(循环)14
描述
给出一些整数对,它们表示一些平面上的坐标点,给定一个点,求所有那些点到该点最短距离的点。结构为:第一个整数对为所给定的点,后面的整数对为所有其他的点。
输入
第一个整数对为所给定的点,后面的整数对为所有其他的点。
输出
到第一个点最短距离的点
样例输入
9 2 1 0 1 1 0 0 1 2 2 1
样例输出
2 1
#include<iostream>
#include<cmath>
using namespace std;
int main() {
int n, m,a,b,x,y;
double l,min;
cin >> n >> m>>a >> b;
l = sqrt((n - a)*(n - a) + (m - b) * (m - b));
min = l;
x = a;
y = b;
while (cin >> a >> b) {
l = sqrt((n-a)*(n-a) + (m-b)*(m-b));
if (min >= l) {
x = a;
y = b;
min = l;
}
}
cout << x << ' ' << y << endl;
return 0;
}
4.粘墙“三角形”
描述
输入一些正整数(≤26),编程输出以这些正整数为边长的附着墙而立的字母三角形。
输入
几个正整数
输出
每个正整数对应的图案。每组图案之间空一行。
样例输入
3 7
样例输出
a a
a ab
aabca a
a ab
a abc
a abcd
a abcde
a abcdef
aabcdefg
#include<iostream>
using namespace std;
int main() {
int n;
char c, b = 'a';
c = b;
while (cin>>n)
for (int i = 1; i <= n; i++) {
b = c;
for (int k = 1; k <= n; k++) {
if (k == 1)
cout << b;
if (k > n - i) {
cout << b;
b++;
}
else
cout << ' ';
}
cout << endl;
if (i == n) //小心"Presentation Error"
cout << endl;
}
return 0;
}
5. 洛谷 P5719 【深基4.例3】分类平均
题目描述
给定 n(n\le10000)n(n≤10000) 和 k(k\le 100)k(k≤100),将从 1 到 nn 之间的所有正整数可以分为两类:A 类数可以被 kk 整除(也就是说是 kk 的倍数),而 B 类数不能。请输出这两类数的平均数,精确到小数点后 1 位,用空格隔开。
数据保证两类数的个数都不会是 0。
输入格式
无
输出格式
无
输入输出样例
100 16
56.0 50.1
原代码:
#include<iostream>
#include<iomanip>
using namespace std;
int main() {
double n,s1=0,s2=0,g1=0,g2=0;
int k;
cin >> n >> k;
for (int i = 1; i <= n; i++) {
if (!(i % k)) {
s1 += i;
g1++;
}
else {
s2 += i;
g2++;
}
}
cout <<fixed<<setprecision(1)<< s1/g1 << ' ' << s2/g2 << endl;
return 0;
}
改进:
1~n的前n项和:(n+1)*n/2
A类数是都是k倍的数
A类数的个数为:n/k
#include<iostream>
#include<iomanip>
using namespace std;
int main() {
int n, k, Asum = 0, Bsum = 0;
cin >> n >> k;
for (int i = k; i <= n; i+=k) //k倍
Asum += i;
Bsum = (1 + n) * n / 2 - Asum;
cout <<fixed<<setprecision(1)<< (double)Asum/(n/k)
<< ' ' << double(Bsum)/(n-n/k) << endl;
return 0;
}
还可以直接用等差数列求Asum