7-61 输出整数各位数字 分数 15
本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。
输入格式:
输入在一行中给出一个长整型范围内的非负整数。
输出格式:
从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格。
输入样例:
123456
输出样例:
1 2 3 4 5 6
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <iostream>
#include <stack>
using namespace std;
stack<int> st;
unsigned long long n;
// 迭代递归均可,这里采用迭代法
int main()
{
cin >> n;
do st.push(n % 10); while(n /= 10);
while(st.size()) printf("%d ", st.top()), st.pop();
return 0;
}
7-62 验证“哥德巴赫猜想” 分数 20
数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。
输入格式:
输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。
输出格式:
在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。
输入样例:
24
输出样例:
24 = 5 + 19
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <iostream>
using namespace std;
int n;
bool check(int p)
{
if(p <= 1) return false;
for(int i = 2; i <= p / i; ++ i)
if(p % i == 0) return false;
return true;
}
int main()
{
cin >> n;
for(int i = 2; i <= n / 2; ++ i)
if(check(i) && check(n - i))
{
printf("%d = %d + %d\n", n, i, n - i);
break;
}
return 0;
}
7-63 找完数 分数 20
所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。
输入格式:
输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。
输出格式:
逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。
输入样例:
2 30
输出样例:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <iostream>
using namespace std;
int n, m;
bool check(int p)
{
int res = 0;
for(int i = 1; i <= p / 2; ++ i)
if(p % i == 0) res += i;
return res == p;
}
int main()
{
bool flag = true;
cin >> n >> m;
for(int i = n; i <= m; ++ i)
if(check(i))
{
printf("%d = 1", i);
for(int j = 2; j <= i / 2; ++ j)
if(i % j == 0) printf(" + %d", j);
flag = false;
putchar('\n');
}
if(flag) puts("None");
return 0;
}
7-64 打印九九口诀表 分数 15
下面是一个完整的下三角九九口诀表:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
本题要求对任意给定的一位正整数N
,输出从1*1
到N*N
的部分口诀表。
输入格式:
输入在一行中给出一个正整数N
(1≤N
≤9)。
输出格式:
输出下三角N*N
部分口诀表,其中等号右边数字占4位、左对齐。
输入样例:
4
输出样例:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <iostream>
using namespace std;
int n;
int main()
{
cin >> n;
for(int i = 1; i <= n; ++ i)
{
for(int j = 1; j <= i; ++ j)
printf("%d*%d=%-4d", j, i, i * j);
putchar('\n');
}
return 0;
}
7-65 近似求PI 分数 15
本题要求编写程序,根据下式求π的近似值,直到最后一项小于给定精度eps。
2π=1+31!+3×52!+3×5×73!+⋯+3×5×⋯×(2×i+1)i!+⋯
输入格式:
输入在一行中给出精度eps,可以使用以下语句来读输入:
scanf("%le", &eps);
输出格式:
在一行内,按照以下格式输出π的近似值(保留小数点后5位):
PI = 近似值
输入样例:
1E-5
输出样例:
PI = 3.14158
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <iostream>
using namespace std;
double e;
double ans = 1, tot = 1;
int main()
{
cin >> e;
for(int i = 1; tot >= e; ++ i)
tot = tot * i / (2 * i + 1), ans += tot;
printf("PI = %.5lf\n", 2 * ans);
return 0;
}
7-66 统计一行文本的单词个数 分数 15
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出单词个数。
输入样例:
Let's go to room 209.
输出样例:
5
鸣谢用户 张麦麦 补充数据!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <iostream>
using namespace std;
string input;
int cnt;
// 利用cin遇到空格结束一次读入的特性即可, scanf同理
int main()
{
while(cin >> input) cnt ++;
cout << cnt << endl;
return 0;
}
7-67 查找整数 分数 10
本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。
输入格式:
输入在第一行中给出两个正整数N(≤20)和X,第二行给出N个整数。数字均不超过长整型,其间以空格分隔。
输出格式:
在一行中输出X的位置,或者“Not Found”。
输入样例1:
5 7
3 5 7 1 9
输出样例1:
2
输入样例2:
5 7
3 5 8 1 9
输出样例2:
Not Found
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <iostream>
using namespace std;
typedef long long LL;
LL n, x;
int main()
{
cin >> n >> x;
bool flag = true;
for(int i = 0; i < n; ++ i)
{
int temp; cin >> temp;
if(temp == x)
{
cout << i << endl;
flag = false;
break;
}
}
if(flag) puts("Not Found");
return 0;
}
7-68 将数组中的数逆序存放 分数 20
本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。
输入格式:
输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。
输出格式:
在一行中输出这n个整数的处理结果,相邻数字中间用一个空格分开,行末不得有多余空格。
输入样例:
4
10 8 1 2
输出样例:
2 1 8 10
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <iostream>
#include <vector>
using namespace std;
vector<int> st;
int n;
int main()
{
cin >> n;
for(int i = 1; i <= n; ++ i)
{
int temp; cin >> temp;
st.push_back(temp);
}
for(int i = st.size() - 1; i >= 0; -- i)
printf("%d%s", st[i], i ? " " : "");
return 0;
}
7-69 选择法排序 分数 20
本题要求将给定的n个整数从大到小排序后输出。
输入格式:
输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。
输入样例:
4
5 1 7 6
输出样例:
7 6 5 1
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <iostream>
using namespace std;
const int N = 1010;
int st[N];
int n;
// 选择排序思想:
// 1.每次将序列分为两部分,分别为有序区和无序区, 初始时有序区为空
// 2.每一轮排序时,在无序区中选取需要的最值(顺排/逆排),将其放入有序区末尾
// 3.重复n次,序列有序化
int main()
{
cin >> n;
for(int i = 1; i <= n; ++ i) cin >> st[i];
for(int i = 1; i < n; ++ i)
{
int mx = i;
for(int j = i + 1; j <= n; ++ j)
if(st[mx] < st[j]) mx = j;
swap(st[i], st[mx]);
}
for(int i = 1; i <= n; ++ i)
cout << st[i] << " "[i == n];
return 0;
}
7-70 交换最小值和最大值 分数 15
本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
注意:题目保证最大和最小值都是唯一的。
输入格式:
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。
输出格式:
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
输入样例:
5
8 2 5 1 4
输出样例:
1 2 5 4 8
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <iostream>
using namespace std;
const int N = 1010;
int st[N];
int mx = 1, mn = 1;
int n;
int main()
{
cin >> n;
for(int i = 1; i <= n; ++ i) cin >> st[i];
for(int i = 1; i <= n; ++ i)
{
if(st[mx] < st[i]) mx = i;
if(st[mn] > st[i]) mn = i;
}
swap(st[1], st[mn]);
if(mx == 1) mx = mn;
swap(st[n], st[mx]);
for(int i = 1; i <= n; ++ i)
printf("%d ", st[i]);
return 0;
}