文章目录
- 7-152 打印沙漏
- 7-153 连续因子
- 7-154 乘法口诀数列
- 7-155 求n以内最大的k个素数以及它们的和
- 7-156 数组循环左移
- 7-157 Left-pad
- 7-158 小于m的最大的10个素数
- 7-159 猜数字
- 7-160 素因子分解
- 7-161 英文字母替换加密(大小写转换+后移1位)
- 7-162 凯撒密码
- 7-163 将数组中的数逆序存放
- 7-164 在矩阵中找满足要求的数
- 7-165 红包
- 7-166 统计组成的四位数
- 7-167 找出10个整数中的最大值、最小值、偶数的个数、偶数的平均值。
- 7-168 求n项和值
- 7-169 求完数
- 7-170 输出数字三角阵
- 7-171 高空坠球
- 7-172 找出不是两个数组共有的元素
- 7-173 简单计算器
- 7-174 选择法排序
- 7-175 找鞍点
- 7-176 输出学生成绩
- 7-177 求一元二次方程的根
- 7-178 验证“哥德巴赫猜想”
- 7-179 找完数
- 7-180 梅森数
- 7-181 打印杨辉三角
- 7-182 删除重复字符
- 7-183 统计字符出现次数
- 7-184 装箱问题
- 7-185 组个最小数
- 7-186 找出总分最高的学生
- 7-187 圆形体体积计算器
- 7-188 龟兔赛跑
- 7-189 冒泡法排序
- 7-190 猴子选大王
- 7-191 删除字符串中的子串
- 7-192 字符串的冒泡排序
- 7-193 字符串循环左移
- 7-194 说反话-加强版
- 7-195 整数分解为若干项之和
- 7-196 数列求和-加强版
- 7-197 输出全排列
- 7-198 N个数求和
- 7-199 A-B
- 7-200 天梯赛的善良
7-151 找出三位水仙花数
分数 6
作者 颜晖
单位 浙大城市学院
本题要求编写程序,输出给定正整数M和N区间内的所有三位水仙花数。三位水仙花数,即其个位、十位、百位数字的立方和等于该数本身。
输入格式:
输入在一行中给出两个正整数M和N(100≤M≤N≤999)。
输出格式:
顺序输出M和N区间内所有三位水仙花数,每一行输出一个数。若该区间内没有三位水仙花数,则无输出。
如果M或者N不符合题目的要求,则输出Invalid Value.。
输入样例1:
100 400
输出样例1:
153
370
371
输入样例2:
500 600
输出样例2:
输入样例3:
990 101
输出样例3:
Invalid Value.
#include<stdio.h>
#include<math.h>
int main()
{
int M,N,q,w;
int g,s,b;
scanf("%d%d",&M,&N);
q=M;
w=N;
if(M<=N&&M>=100&&N>=100&&N<=999)//判断输入数字是否合法
{
for(q;q<=w;q++)
{
g=q%10;
s=q%100/10;
b=q/100;//取得输入数字的个十百位
if(q==pow(g,3)+pow(s,3)+pow(b,3))//判断是否为水仙花数
{
printf("%d\n",q);//如果是则输出
}
}
}
else//不合法的输入
{
printf("Invalid Value.");
}
return 0;
}
7-152 打印沙漏
分数 5
作者 陈越
单位 浙江大学
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
2
#include<stdio.h>
int main()
{
int n;
char c;
while(~scanf("%d %c",&n,&c))
{
int sum=n-1;
int floor=1;
int a=3;
while(sum)
{
if(sum-a*2<0) break;
sum-=a*2;
a+=2;
floor++;
}
for(int i=0,j=floor-1;i<floor;i++,j--)
{
for(int k=0;k<i;k++)
{
printf(" ");
}
int res=1+2*j;
for(int k=0;k<res;k++)
{
printf("%c",c);
}
printf("\n");
}
for(int i=1,j=floor-1-1;i<floor;i++,j--)
{
for(int k=0;k<j;k++)
{
printf(" ");
}
int res=1+2*i;
for(int k=0;k<res;k++)
{
printf("%c",c);
}
printf("\n");
}
printf("%d\n",sum);
}
return 0;
}
7-153 连续因子
分数 6
作者 陈越
单位 浙江大学
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<2
31
)。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例:
630
输出样例:
3
567
#include<stdio.h>
int main(){
int j=2,a[31]={0},b[31]={0};
int n,i=0,flag=1,k,l=0,minlen=1;
scanf("%d",&n);
for(j=2;flag;j++){
k=n;
l=j;
i=0;
while(k>=l){
if(k%l==0){
k=k/l;
a[i]=l;
i++;
l++;
}
else
break;
}
if(n<=1LL*j*j)
flag=0;
else{
if(i>minlen){
minlen=i;
for(i=0;i<minlen;i++)
b[i]=a[i];
}
}
}
printf("%d\n",minlen);
if(minlen==1&&a[0]==0)
printf("%d",n);
else if(minlen==1&&a[0]!=0)
printf("%d",a[0]);
else{
for(i=0;i<minlen-1;i++)
printf("%d*",b[i]);
printf("%d",b[i]);
}
return 0;
}
7-154 乘法口诀数列
分数 6
作者 陈越
单位 浙江大学
本题要求你从任意给定的两个 1 位数字 a
1
和 a
2
开始,用乘法口诀生成一个数列 {a
n
},规则为从 a
1
开始顺次进行,每次将当前数字与后面一个数字相乘,将结果贴在数列末尾。如果结果不是 1 位数,则其每一位都应成为数列的一项。
输入格式:
输入在一行中给出 3 个整数,依次为 a
1
、a
2
和 n,满足 0≤a
1
,a
2
≤9,0<n≤10
3
。
输出格式:
在一行中输出数列的前 n 项。数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
2 3 10
输出样例:
2 3 6 1 8 6 8 4 8 4
样例解释:
数列前 2 项为 2 和 3。从 2 开始,因为 2×3=6,所以第 3 项是 6。因为 3×6=18,所以第 4、5 项分别是 1、8。依次类推…… 最后因为第 6 项有 6×8=48,对应第 10、11 项应该是 4、8。而因为只要求输出前 10 项,所以在输出 4 后结束。
#include <stdio.h>
int main()
{
int a[2001],i,j=1,x,y,n,t;
scanf("%d%d%d",&x,&y,&n);
a[0]=x;a[1]=y;
for(i=0;i<n-2;i++)
{
t=a[i]*a[i+1];
if(t<10)
a[++j]=t;
else
{
a[++j]=t/10;
a[++j]=t%10;
}
}
for(i=0;i<n;i++)
{
printf("%d",a[i]);
if(i<n-1)
printf(" ");
}
return 0;
}
7-155 求n以内最大的k个素数以及它们的和
分数 6
作者 林颖贤
单位 集美大学
本题要求计算并输出不超过n的最大的k个素数以及它们的和。
输入格式:
输入在一行中给出n(10≤n≤10000)和k(1≤k≤10)的值。
输出格式:
在一行中按下列格式输出:
素数1+素数2+…+素数k=总和值
其中素数按递减顺序输出。若n以内不够k个素数,则按实际个数输出。
输入样例1:
1000 10
输出样例1:
997+991+983+977+971+967+953+947+941+937=9664
输入样例2:
12 6
输出样例2:
11+7+5+3+2=28
#include <stdio.h>
int main()
{
int n,k,i,j,q=0,sum=0;
scanf("%d%d",&n,&k);
i=n;
for(i;i>=2;i--)
{
int isprime =1;
for(j=2;j<i-1;j++)
{
if(i%j==0){isprime=0;break;}
}
if(isprime==1)
{
sum+=i;
if(q==0)printf("%d",i);
else printf("+%d",i);
q++;
}
if(q>=k||i==2)
{
printf("=%d",sum);
break;
}
}
return 0;
}
7-156 数组循环左移
分数 5
作者 DS课程组
单位 浙江大学
本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a
0
a
1
⋯a
n−1
)变换为(a
m
⋯a
n−1
a
0
a
1
⋯a
m−1
)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出循环左移m位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
8 3
1 2 3 4 5 6 7 8
输出样例:
4 5 6 7 8 1 2 3
#include<iostream>
using namespace std;
int main(void){
int a[101];
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i < n;i++)
scanf("%d",&a[i]);
for(int i =m;i<n+m;i++){
if( i >=n)
printf("%d",a[ i%n]);
else printf("%d",a[i]);
if( i == n+m -1)
printf("\n");
else printf(" ");
}
}
return 0;
}
7-157 Left-pad
分数 5
作者 陈越
单位 浙江大学
根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块把javascript里面的React/Babel干瘫痪了。这是个什么样的模块?就是在字符串前填充一些东西到一定的长度。例如用去填充字符串GPLT,使之长度为10,调用left-pad的结果就应该是*****GPLT。Node社区曾经对left-pad紧急发布了一个替代,被严重吐槽。下面就请你来实现一下这个模块。
输入格式:
输入在第一行给出一个正整数N(≤10
4
)和一个字符,分别是填充结果字符串的长度和用于填充的字符,中间以1个空格分开。第二行给出原始的非空字符串,以回车结束。
输出格式:
在一行中输出结果字符串。
输入样例1:
15 _
I love GPLT
输出样例1:
____I love GPLT
输入样例2:
4 *
this is a sample for cut
输出样例2:
cut
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
char a;
string s;
cin >> n >> a;
getchar();
getline(cin, s);
if (n >= s.length())
{
for (int i = 0; i < n - s.length(); i++)
cout << a;
cout << s;
}
else
{
for (int i = s.length() - n; i < s.length(); i++)
cout << s[i];
}
}
7-158 小于m的最大的10个素数
分数 5
作者 王淑琴
单位 天津师范大学
给定一个整数m(50<m<20000),找出小于m的最大的10个素数。
输入格式:
输入在一行中给出一个正整数m(50<m<20000)。
输出格式:
在一行中按递减顺序输出10个满足条件的素数,每个素数输出占6列。没有其它任何附加格式和字符。
输入样例:
229
输出样例:
227 223 211 199 197 193 191 181 179 173
#include<stdio.h>
int main()
{
int judge(int n);
int m, i, count = 0;
scanf("%d", &m);
for ( i = m-1; i > 1; i--)
{
if(judge(i))
{
printf("%6d", i);
count++;
}
if (count == 10)break;
}
}
int judge(int n)
{
int i;
for (i = 2; i < n; i++)
if (n%i == 0)break;
if (i < n) return 0;
else return 1;
}
7-159 猜数字
分数 5
作者 陈越
单位 浙江大学
一群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家。
输入格式:
输入在第一行给出一个正整数N(≤10
4
)。随后 N 行,每行给出一个玩家的名字(由不超过8个英文字母组成的字符串)和其猜的正整数(≤ 100)。
输出格式:
在一行中顺序输出:大家平均数的一半(只输出整数部分)、赢家的名字,其间以空格分隔。题目保证赢家是唯一的。
输入样例:
7
Bob 35
Amy 28
James 98
Alice 11
Jack 45
Smith 33
Chris 62
输出样例:
22 Amy
#include <stdio.h>
#include<math.h>
#include<stdlib.h>
int main()
{
char name_deposit[10000][9];
//储存名字
int N, n, i, mD_value, sum = 0, num_deposit[10000];
//差值mD_value 存储num
double ave;//也可以为int型
scanf("%d", &N);
for (i = 0; i < N; i++)//将输入的name与num存储,首项开始1-1对应
{
scanf("%s %d", name_deposit[i], &num_deposit[i]);
sum += num_deposit[i];
ave = sum / (2 * N);
}
mD_value = fabs(num_deposit[0] - ave);//将第一个num与ave的差值作为最小
for (i = 0; i < N; i++)
if (fabs(num_deposit[i] - ave) <= mD_value)//比较差值大小
{
n = i;//对应的位置
mD_value = fabs(num_deposit[i] - ave);
}
printf("%.0lf %s\n", ave, name_deposit[n]);
return 0;}
7-160 素因子分解
分数 5
作者 何钦铭
单位 浙江大学
给定某个正整数 N,求其素因子分解结果,即给出其因式分解表达式 N=p
1
k
1
⋅p
2
k
2
⋯p
m
k
m
。
输入格式:
输入long int范围内的正整数 N。
输出格式:
按给定格式输出N的素因式分解表达式,即 N=p1k1*p2k2*…*pm^km,其中pi为素因子并要求由小到大输出,指数ki为pi的个数;当ki为1即因子pi只有一个时不输出ki。
输入样例:
1323
输出样例:
1323=33*72
#include<stdio.h>
int main(void)
{
long int arr[8192] = { 0 }, a = 0, l = 0, flag = 1;
scanf("%ld", &a);
long int b = a;
printf("%ld=", a);
if (a == 0 || a == 1) { printf("%d", a); return 0; }
for (long int i = 2; i < 8192; i++) {
if (a % i == 0) {
while (a % i == 0) {
a /= i;
arr[i]++;
}
}
}
for (long int i = 2; i < 8192; i++) {
if (arr[i]) {
if (flag && arr[i] != 1) {
printf("%ld^%ld", i, arr[i]);
flag = 0;
}
else if (flag && arr[i] == 1) {
flag = 0;
printf("%ld", i);
}
else if (!flag && arr[i] != 1)printf("*%ld^%ld", i, arr[i]);
else if (!flag && arr[i] == 1)printf("*%ld", i);
}
}
return 0;
}
7-161 英文字母替换加密(大小写转换+后移1位)
分数 6
作者 颜晖
单位 浙大城市学院
本题要求编写程序,将英文字母替换加密。为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。变换规则是:将明文中的所有英文字母替换为字母表中的后一个字母,同时将小写字母转换为大写字母,大写字母转换为小写字母。例如,字母a->B、b->C、…、z->A、A->b、B->c、…、Z->a。输入一行字符,将其中的英文字母按照以上规则转换后输出,其他字符按原样输出。
输入格式:
输入一行字符,以回车符 '\n’作为 结束符。
输出格式:
将输入的一行字符中的所有英文字母替换为字母表中的后一个字母,同时将小写字母转换为大写字母,大写字母转换为小写字母后输出,其他字符按原样输出。
输入样例:
在这里给出一组输入。例如:
Reold Z123?
输出样例:
在这里给出相应的输出。例如:
sFPME a123?
#include<stdio.h>
int main(){
char c,delta;
delta='A'-'a';
do{
scanf("%c",&c);
if(c>='a'&&c<'z')c+=(delta+1);
else if(c>='A'&&c<'Z')c-=(delta-1);
else if(c=='Z')c='a';
else if(c=='z')c='A';
printf("%c",c);
}while(c!='\n');
return 0;
}
7-162 凯撒密码
分数 7
作者 颜晖
单位 浙大城市学院
为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。
输入格式:
输入第一行给出一个以回车结束的非空字符串(少于80个字符);第二行输入一个整数offset。
输出格式:
输出加密后的结果字符串。
输入样例1:
Hello Hangzhou
2
输出样例1:
Jgnnq Jcpibjqw
输入样例2:
a=x+y
-1
输出样例2:
z=w+x
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
string s;
getline(cin,s);
ll n;
cin>>n;
n%=26;
for(int i=0;i<s.size();i++)
{
if(s[i]<'A'||(s[i]>'Z'&&s[i]<'a') || s[i]>'z')
{
cout<<s[i];
}
else
{
char l;
if(s[i]<='z'&&s[i]>='a')
{
l=(s[i]-'a'+n+26)%26+'a';
}
else
{
l=(s[i]-'A'+n+26)%26+'A';
}
cout<<(char)l;
}
}
return 0;
}
7-163 将数组中的数逆序存放
分数 5
作者 王
单位 兰州交通大学
本题要求编写程序,将给定的8个整数存入数组中,将数组中的这8个数逆序存放,再按顺序输出数组中的元素
输入格式:
在一行中输入8个绝对值不超过100的整数,用空格分开
输出格式:
在一行中输出这8个整数的处理结果,每个数字字段宽度4,数字后插入一个空格。
输入样例:
在这里给出一组输入。例如:
18 -29 6 72 49 0 65 77
输出样例:
在这里给出相应的输出。例如:
77 65 0 49 72 6 -29 18
#include<stdio.h>
int main(){
int a[11], i, n;
//scanf("%d", &n);
for(i = 1; i <= 8; i++){ //将输入数依次赋值给数组a的n个元素;
scanf("%d", &a[i]);
}
for(i = 8; i >= 1; i--){
printf("% 4d", a[i]);
if(i == 1) continue;
printf(" ");
}
return 0;
}
7-164 在矩阵中找满足要求的数
分数 5
作者 王
单位 浙江大学
在一个矩阵A中,求绝对值最大元素所在的行、列位置。
1.jpg
输入格式:
本题无输入,通过初始化给数组赋值。
输出格式:
在一行中输出,绝对值最大元素在 x行 x列。整数输出字段宽度2
输入样例:
输出样例:
绝对值最大元素在 1行 3列
php
7-165 红包
分数 5
作者 DS课程组
单位 临沂大学
派"红包"是新年的一种习俗,寓意祝愿和好运。X公司今年盈利颇丰,临近年关去银行取了充足百元现金,为全体员工准备过年红包。年末银行会准备很多连号的人民币供市民使用,X公司也取到了很多连号人民币,并且决定红包里先包这些连号人民币。由于X公司取到的现金较多,需要你编个程序帮助它统计连号人民币张数超过10(包括10)的个数,并输出最长连号人民币。
输入格式:
输入为两行,第一行为一个正整数 n (1≤n≤10
5
),代表百元人民币的张数。
随后一行为n个正整数,分别代表每一张人民币的编号(不超过8位的非负整数),中间用空格隔开。
输出格式:
输出为两行,第一行为一个整数,表示输入序列中连号人民币的张数超过10的序列个数。
第二行按照输入顺序输出最长连号人民币的编号,中间用1个空格分隔,首尾不能有多余空格。最长连号人民币如果有多个,输出最先出现的那个。
输入样例:
10
1 2 3 4 5 6 7 8 9 10
输出样例:
1
1 2 3 4 5 6 7 8 9 10
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 100000+10;
int a[N];
struct NUM
{
int l;
int r;
int lenth;
};
int cmp(NUM A,NUM B)
{
if(A.lenth!=B.lenth)
return A.lenth>B.lenth;
return A.l<B.l;
}
vector<NUM> A;
int main()
{
int n;
cin>>n;
for(int i = 1;i <= n;i ++ )cin>>a[i];
int l=0,r=0,lenth=1,ans=0;
for(int i = 1;i <= n;i ++ )
{
if(a[i+1]-a[i]==1)
{
r++;
lenth++;
}
else
{
if(lenth>=10)
{
ans++;
}
A.push_back({l,r,lenth});
l=r+1;
r=r+1;
lenth=1;
}
}
cout<<ans<<endl;
sort(A.begin(),A.end(),cmp);
for(int i = A[0].l+1;i <= A[0].r+1;i ++ )
{
if(i==A[0].l+1)cout<<a[i];
else cout<<' '<<a[i];
}
}
7-166 统计组成的四位数
分数 5
作者 王红鹰
单位 兰州交通大学
打印输出1、2、3、4能组成的所有可能的四位数,并统计个数。
输入格式:
无输入
输出格式:
表控格式输出,每行输出一个组成的四位数,最后一行输出能组成的四位数的个数,按样式:可能的四位数有 XX个输出。
输入样例:
无输入
输出样例:
在这里给出相应的输出。例如:
php
7-167 找出10个整数中的最大值、最小值、偶数的个数、偶数的平均值。
分数 6
作者 吴光生
单位 新余学院
找出10个整数中的最大值、最小值、偶数的个数、偶数的平均值。(使用Scanner类从键盘输入数据。)
请注意:含有main方法的类(class)的名字必须命名为Main,否则调试不成功。
输入格式:
在一行中输入10个整数,中间用空格隔开。
输出格式:
分四行分别输出最大值、最小值、偶数的个数、偶数的平均值。
输入样例:
在这里给出一组输入。例如:
18 -6 12 27 9 31 -20 42 33 75
输出样例:
在这里给出相应的输出。例如:
最大值是75
最小值是-20
偶数的个数是5
偶数的平均值是9.2
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int count = 10;
int max = 0;
int min = 999;
int t;
List<Integer> dList = new ArrayList<Integer>(10);
for (int i = 0; i < count; i++) {
t = scanner.nextInt();
if (t % 2 == 0) {
dList.add(t);
}
if (t > max) {
max = t;
}
if (t < min) {
min = t;
}
}
double sum = 0;
// float sum = dList.stream().reduce(0, Integer::sum) / dList.size();
if(dList.size() > 0)
{
for(int i : dList){
sum += i;
}
sum = sum / dList.size();
}
else sum = 0.0;
System.out.println("最大值是" + max);
System.out.println("最小值是" + min);
System.out.println("偶数的个数是" + dList.size());
System.out.println("偶数的平均值是" + sum);
}
}
7-168 求n项和值
分数 5
作者 王红鹰
单位 兰州交通大学
编写计算下式的和值,N值由键盘输入。
1+(1+3)+(1+3+5)+(1+3+5+7)+…+(1+3+5+7+…+N)
输入格式:
输入一个奇数
输出格式:
表控格式输出和值
输入样例:
在这里给出一组输入。例如:
27
输出样例:
在这里给出相应的输出。例如:
1015
#include<bits/stdc++.h>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
int n;
cin>>n;int sum=0;int num=0;
for(int i=1;i<=n;i+=2){
num+=i;
sum+=num;
}
for(int i=0;i<8;i++)cout<<" ";
cout<<sum;
return 0;
}
7-169 求完数
分数 6
作者 王红鹰
单位 兰州交通大学
编写程序求2至10000之间的所有“完数”。所谓“完数”是指除自身之外的所有因子之和等于自身的数。如28是一个完数,因为28的因子有:1、2、4、7、14,,且:8=1+2+4+7+14
输入格式:
无输入
输出格式:
表控格式输出,一行输出一个完数
输入样例:
无输入
输出样例:
6
28
496
8128
代码长度限制
php
7-170 输出数字三角阵
分数 6
作者 王红鹰
单位 兰州交通大学
编程输出如下数字三角阵。
10.jpg
输入格式:
无输入
输出格式:
有格式输出,整数的字段宽度为3,每个数后面输出2个空格
输入样例:
无输入
输出样例:
1
7 8
13 14 15
19 20 21 22
25 26 27 28 29
31 32 33 34 35 36
25 26 27 28 29
19 20 21 22
13 14 15
7 8
1
代码长度限制
php
7-171 高空坠球
分数 6
作者 C课程组
单位 浙江大学
皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?
输入格式:
输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。
输出格式:
在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。
输入样例:
33 5
输出样例:
94.9 1.0
代码长度限制
#include<stdio.h>
int main(){
int i,n;
double H,h,s;//H初始高度,h反弹高度
scanf("%lf %d",&H,&n);
if(n==0)printf("0.0 0.0");//没下落
else {
s=H;//第一次落地经过的距离
h=H/2;//第一次反弹高度
for(i=2;i<=n;i++){//从第二次开始累加
s+=2*h;
h/=2;
}
printf("%.1lf %.1lf",s,h);
}
return 0;
}
7-172 找出不是两个数组共有的元素
分数 5
作者 张彤彧
单位 浙江大学
给定两个整型数组,本题要求找出不是两者共有的元素。
输入格式:
输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。
输出格式:
在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。
输入样例:
10 3 -5 2 8 0 3 5 -15 9 100
11 6 4 8 2 6 -5 9 0 100 8 1
输出样例:
3 5 -15 6 4 1
#include <stdio.h>
int main() {
int n, m, i, j, flag, first = 0,cnt=0;
scanf("%d", &n);
int a[n];
for (i = 0; i < n; i++)scanf("%d", &a[i]);
scanf("%d", &m);
int b[m];
int s[m+n];
for (j = 0; j < m; j++)scanf("%d", &b[j]);
for (i = 0; i < n; i++) {
flag = 0;
for (j = 0; j < m; j++) {
if (a[i] == b[j]) {
flag = 1;
break;
}
}
if (flag == 0) {
if (first == 0) {
s[cnt]=a[i];
cnt++;
first = 1;
} else{
s[cnt]=a[i];
cnt++;
}
}
}
for (j = 0; j < m; j++) {
flag = 0;
for (i = 0; i < n; i++) {
if (a[i] == b[j]) {
flag = 1;
break;
}
}
if (flag == 0) {
if (first == 0) {
s[cnt]=b[j];
cnt++;
first = 1;
} else{
s[cnt]=b[j];
cnt++;
}
}
}
printf("%d",s[0]);
for(i=1;i<cnt;i++){
flag=0;
for(j=0;j<i;j++){
if(s[i]==s[j]){
flag=1;
break;
}
}
if(flag==0)printf(" %d",s[i]);
}
return 0;
}
7-173 简单计算器
分数 5
作者 张彤彧
单位 浙江大学
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
输入样例:
1+2*10-10/2=
输出样例:
10
#include<stdio.h>
int main(){
int a,sum;
char c;
scanf("%d",&sum);
scanf("%c",&c);
while(c!='='){
scanf("%d",&a);
switch(c){
case '+':sum+=a;break;
case '-':sum-=a;break;
case '*':sum*=a;break;
case '/':
if(a==0){
printf("ERROR");
return 0;
}
else sum/=a;
break;
default:printf("ERROR");
return 0;
}
scanf("%c",&c);
}
printf("%d",sum);
return 0;
}
7-174 选择法排序
分数 5
作者 C课程组
单位 浙江大学
本题要求将给定的n个整数从大到小排序后输出。
输入格式:
输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。
输入样例:
4
5 1 7 6
输出样例:
7 6 5 1
#include<stdio.h>
int main(){
int i,j,n,temp=0,max;//temp、max记录数组序号
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)scanf("%d",&a[i]);
for(i=0;i<n;i++){
max=i;
temp = a[i];
for(j=i;j<n;j++)if(a[j]>a[max])max = j;
a[i] = a[max];
a[max] = temp;
}
printf("%d",a[0]);
for(int i=1;i<n;i++)printf(" %d",a[i]);
}
7-175 找鞍点
分数 6
作者 C课程组
单位 浙江大学
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
输入样例1:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例1:
2 1
输入样例2:
2
1 7
4 1
输出样例2:
NONE
#include<stdio.h>
int main(){
int n,i,j,k,t=0;
int max,min,flag;
scanf("%d",&n);
int a[n][n];
for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%d",&a[i][j]);
for(i=0;i<n;i++){
max=0;
for(j=0;j<n;j++)if(a[i][j]>=a[i][max])max=j;
flag=1;
for(k=0;k<n;k++)if(a[i][max]>a[k][max])flag=0;
if(flag==1){
printf("%d %d\n",i,max);
break;
}
}
if(flag==0)printf("NONE");
return 0;
}
7-176 输出学生成绩
分数 5
作者 张泳
单位 浙大城市学院
本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。建议使用动态内存分配来实现。
输入格式:
输入第一行首先给出一个正整数N,表示学生的个数。接下来一行给出N个学生的成绩,数字间以空格分隔。
输出格式:
按照以下格式输出:
average = 平均成绩
max = 最高成绩
min = 最低成绩
结果均保留两位小数。
输入样例:
3
85 90 95
输出样例:
average = 90.00
max = 95.00
min = 85.00
#include<stdio.h>
int main(){
int n,i;
scanf("%d",&n);
double a[n],sum,average,min,max;
scanf("%lf",&a[0]);
min=a[0];
max=a[0];
sum=a[0];
for(i=1;i<n;i++){
scanf("%lf",&a[i]);
if(a[i]>max)max=a[i];
if(a[i]<min)min=a[i];
sum+=a[i];
}
average=sum/n;
printf("average = %.2lf\n",average);
printf("max = %.2lf\n",max);
printf("min = %.2lf",min);
return 0;
}
7-177 求一元二次方程的根
分数 5
作者 陈建海
单位 浙江大学
本题目要求一元二次方程ax
2
+bx+c=0的根,结果保留2位小数。
输入格式:
输入在一行中给出3个浮点系数a、b、c,中间用空格分开。
输出格式:
根据系数情况,输出不同结果:
1)如果方程有两个不相等的实数根,则每行输出一个根,先大后小;
2)如果方程有两个不相等复数根,则每行按照格式“实部+虚部i”输出一个根,先输出虚部为正的,后输出虚部为负的;
3)如果方程只有一个根,则直接输出此根;
4)如果系数都为0,则输出"Zero Equation";
5)如果a和b为0,c不为0,则输出"Not An Equation"。
输入样例1:
2.1 8.9 3.5
输出样例1:
-0.44
-3.80
输入样例2:
1 2 3
输出样例2:
-1.00+1.41i
-1.00-1.41i
输入样例3:
0 2 4
输出样例3:
-2.00
输入样例4:
0 0 0
输出样例4:
Zero Equation
输入样例5:
0 0 1
输出样例5:
Not An Equation
#include <stdio.h>
#include <math.h>
int main()
{
float a,b,c;
while(scanf("%f%f%f",&a,&b,&c)!=EOF)
{
if(a==0 && b==0 && c==0)
printf("Zero Equation\n");
else
{
float x,x1,x2,m;
if(a==0 && b==0 && c!=0)
printf("Not An Equation\n");
if(a==0 && b!=0 && c!=0)
printf("%.2f\n",-c/b);
if(a!=0 && b!=0)
{
if(b*b-4*a*c==0)
{
m=-b/(2*a);
printf("%.2f\n",m);
}
if(b*b-4*a*c>0)
{
x=sqrt(b*b-4*a*c);
x1=(-b+x)/(2*a);
x2=(-b-x)/(2*a);
printf("%.2f\n",x1);
printf("%.2f\n",x2);
}
if(b*b-4*a*c<0)
{
x=sqrt(4*a*c-b*b);
x1=-b/(2*a);
x2=x/(2*a);
printf("%.2f+%.2fi\n",x1,x2);
printf("%.2f-%.2fi\n",x1,x2);
}
}
if(a!=0 && b==0 && c!=0)
{
printf("0.00+%.2fi\n",sqrt(c/a));
printf("0.00-%.2fi\n",sqrt(c/a));
}
if(a!=0 && b==0 && c==0 )
printf("0.00\n");
}
}
return 0;
}
7-178 验证“哥德巴赫猜想”
分数 5
作者 徐镜春
单位 浙江大学
数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于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
#include <stdio.h>
int is_prime(int n)
{
if (n < 2) {
return 0;
}
if (n == 2 ) {
return 1;
}
if (n % 2 == 0) {
return 0;
}
for (int i = 3; i * i <= n; i += 2) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 2; i < n ; i ++) {
if (is_prime(i) && is_prime(n - i)) {
printf("%d = %d + %d", n, i, n - i);
break;
}
}
}
7-179 找完数
分数 5
作者 陈建海
单位 浙江大学
所谓完数就是该数恰好等于除自身外的因子之和。例如: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
#include <stdio.h>
int main()
{
int i,m,n;
scanf("%d %d",&m,&n);
int count=0;
for(i=m;i<=n;i++)
{
int sum=0,a,b;
for(a=1;a<i;a++)
{
b=i%a;
if(b==0)
sum=sum+a;
}
if(sum==i){
printf("%d = 1",sum);
int c,d;
for(c=2;c<i;c++)
{
d=i%c;
if(d==0)
printf(" + %d",c);
}
printf("\n");count=count+1;}
}
if(count==0)
printf("None");
}
7-180 梅森数
分数 5
作者 颜晖
单位 浙大城市学院
形如2
n
−1的素数称为梅森数(Mersenne Number)。例如2
2
−1=3、2
3
−1=7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了2
31
−1=2147483647是一个素数,堪称当时世界上“已知最大素数”的一个记录。
本题要求编写程序,对任一正整数n(n<20),输出所有不超过2
n
−1的梅森数。
输入格式:
输入在一行中给出正整数n(n<20)。
输出格式:
按从小到大的顺序输出所有不超过2
n
−1的梅森数,每行一个。如果完全没有,则输出“None”。
输入样例:
6
输出样例:
3
7
31
代码长度限制
#include<stdio.h>
#include<math.h>
int main()
{
int n,i,j,k;
int flag=1; //判断是否是素数
scanf("%d",&n);
if(n<2)
printf("None"); //小于2的不存在梅森数
for(i=2;i<=n;i++)
{
flag=1;
k=pow(2,i)-1;
for(j=2;j<k;j++)
{
if(k%j==0) //不是素数
{
flag=0;
break;
}
}
if(flag)
printf("%d\n",k); //梅森数
}
}
7-181 打印杨辉三角
分数 5
作者 徐镜春
单位 浙江大学
本题要求按照规定格式打印前N行杨辉三角。
输入格式:
输入在一行中给出N(1≤N≤10)。
输出格式:
以正三角形的格式输出前N行杨辉三角。每个数字占固定4位。
输入样例:
6
输出样例:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
#include<stdio.h>
int main()
{
int arr[11][11];
int n=0;
arr[0][0]=0;
//输出n
scanf("%d",&n);
//打印,先控制行数外层循环
for(int i=0;i<n;i++)
{
//打印空格
for(int k=0;k<n-i-1;k++)
{
printf(" ");
}
//打印数据
for(int j=0;j<=i;j++)
{
//这个画图找规律,放在二维数组里,第一行就是0行,然后每行的最后一个1,i与j相同换行,第一个元素也是1,j=0然后根据杨辉三角的规律写中间元素
if(i==j)
{
arr[i][j]=1;
}
else if(j==0)
{
arr[i][j]=1;
}
else
{
arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
}
printf("%4d",arr[i][j]);
if(i==j)
{
printf("\n");
}
}
}
return 0;
}
7-182 删除重复字符
分数 5
作者 颜晖
单位 浙大城市学院
本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
输入样例:
ad2f3adjfeainzzzv
输出样例:
23adefijnvz
#include<stdio.h>
#include<string.h>
#define N 85
//思路:首先用字符数组str1存储输入的字符串,而后删除str1中重复的字符保存到str2中,
// 最后根据ASCII的顺序使用冒泡排序算法进行排序,注意:本题默认只有数字和小写字母
// 两种字符,且根据ASCII码表可知,数字的ASCII值小于小写字母的ASCII值。
// 本题重点是:删除多余的字符,要不断的更新和存储不重复的字符。
int main(void)
{
int i, j, flag, len1 = 0, cnt = 0;
char ch, temp;
char str1[N]; //存储输入的字符串
char str2[N]; //存储处理后的字符串
ch = getchar(); //输入字符串
for (i = 0; ch != '\n'; i++)
{
str1[i] = ch;
len1++;
ch = getchar();
}
for (i = 0; i < len1; i++) //双重循环,删除str1[]中重复的字符
{
flag = 0; //每次开始循环都更新flag
for (j = 0; j < i; j++)
{
if (str1[i] == str1[j]) //在str1中查找重复的字符
{
flag = 1;
}
}
if (flag == 0)
{
str2[cnt] = str1[i]; //用str2保存从str1中找到的字符
cnt++; //记录不重复字符的个数
}
}
for (i = 0; i < cnt - 1; i++) //对str2[]排序: 冒泡排序 进行cnt-1次
{
for (j = 0; j < cnt - i - 1; j++)
{
if (str2[j] > str2[j + 1])
{
temp = str2[j];
str2[j] = str2[j + 1];
str2[j + 1] = temp;
}
}
}
for (i = 0; i < cnt; i++)
{
printf("%c", str2[i]);
}
printf("\n");
return 0;
}
7-183 统计字符出现次数
分数 5
作者 C课程组
单位 浙江大学
本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。
输入格式:
输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。
输出格式:
在一行中输出给定字符在给定字符串中出现的次数。
输入样例:
programming is More fun!
m
输出样例:
2
#!/usr/bin/python
# -*- coding: utf-8 -*-
#python
n = input()
s = str(input())
key = 0
for i in range(0,len(n)):
if s == n[i]:
key +=1
print(key)
7-184 装箱问题
分数 5
作者 DS课程组
单位 浙江大学
假设有N项物品,大小分别为s
1
、s
2
、…、s
i
、…、s
N
,其中s
i
为满足1≤s
i
≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。
输入格式:
输入第一行给出物品个数N(≤1000);第二行给出N个正整数s
i
(1≤s
i
≤100,表示第i项物品的大小)。
输出格式:
按照输入顺序输出每个物品的大小及其所在的箱子序号,每个物品占1行,最后一行输出所需的箱子数目。
输入样例:
8
60 70 80 90 30 40 10 20
输出样例:
60 1
70 2
80 3
90 4
30 1
40 5
10 1
20 2
5
#include<stdio.h>
#include <stdlib.h>
int main()
{
int m,n,i;
scanf("%d",&m);
int a[m];
int c[10007]={0};//箱内物品总大小
int b[m];//记录箱子号
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
}
int k=0;
for(i=0;i<m;i++)
{
int p=0;//设置装箱开关
for(n=0;n<=k;n++)
{
if((c[n]+a[i])<=100)
{
c[n]+=a[i];
b[i]=n+1;
p=1;
break;
}
}
if(p==0)//未装进则再开一个箱子
{ k++;
c[k]+=a[i];
b[i]=k+1;
}
}
for(i=0;i<m;i++)
{
printf("%d %d\n",a[i],b[i]);
}
printf("%d",k+1);
return 0;
}
7-185 组个最小数
分数 5
作者 曹鹏
单位 Google
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入格式:
输入在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。
输出格式:
在一行中输出能够组成的最小的数。
输入样例:
2 2 0 0 0 3 0 0 1 0
输出样例:
10015558
#include <stdio.h>
int main()
{
int min; //记录最小数
int mark; //一个标记
int a[10]; //用这个数组的下标代表0~9数字,输入的数代表每个数字的个数
int b[100];//用来存放所有数字
int j=0;
for(int i=0;i<10;i++)
scanf("%d",&a[i]); //输入每个数字个数
for(int i=0;i<10;i++) //将所有数字存入数组b
{
for(int k=1;k<=a[i];k++) //每个数字有几个就存几个
{
b[j]=i;
j++;
}
}
for(int i=1;i<10;i++) //这一层循环决定输出最小数的第一位,0不能做第一位,找出比0大的最小的数输出一个,注意只输出一个,并让这个数的a[i](数量)减1。
{
if(a[i]!=0)
{
mark=i; //标记比零大的最小数
printf("%d",i);
a[i]--;
break;
}
}
for(int k=1;k<=a[0];k++) //从0开始把剩下的数全输出
printf("0");
for(int i=mark;i<10;i++) //从剩下的比0大的最小数继续输出
for(int k=1;k<=a[i];k++)
printf("%d",i);
return 0;
}
7-186 找出总分最高的学生
分数 5
作者 C课程组
单位 浙江大学
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。
输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。
输出格式:
在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。
输入样例:
5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75
输出样例:
zhangfeng 10001 258
#include <stdio.h>
struct student
{
int id[5];
char name[10];
int a, b, c;
int sum;
}stu[10];
int main()
{
int i, j, N, max;
scanf("%d", &N);
for (i = 0; i < N; i++)
{
scanf("%s %s %d %d %d", &stu[i].id, stu[i].name, &stu[i].a, &stu[i].b, &stu[i].c);
stu[i].sum = stu[i].a + stu[i].b +stu[i].c;
}
for (j = i = 0; i < N; i++)
{
if (stu[j].sum < stu[i].sum)
{
j = i;
}
}
printf("%s %s %d", stu[j].name, stu[j].id, stu[j].sum);
}
7-187 圆形体体积计算器
分数 5
作者 张高燕
单位 浙江大学
本题要求实现一个常用圆形体体积的计算器。计算公式如下:
球体体积 V=
3
4
πr
3
,其中r是球体半径。
圆柱体体积 V=πr
2
h,其中r是底圆半径,h是高。
圆锥体体积 V=
3
1
πr
2
h,其中r是底圆半径,h是高。
输入格式:
在每次计算之前,要求输出如下界面:
1-Ball
2-Cylinder
3-Cone
other-Exit
Please enter your command:
然后从标准输入读进一个整数指令。
输出格式:
如果读入的指令是1或2或3,则执行相应的体积计算;如果是其他整数,则程序结束运行。
当输入为1时,在计算球体体积之前,打印Please enter the radius:,然后读入球体半径,完成计算;
当输入为2时,在计算圆柱体体积之前,打印Please enter the radius and the height:,然后读入底圆半径和高,完成计算;
当输入为3时,在计算圆锥体体积之前,打印Please enter the radius and the height:,然后读入底圆半径和高,完成计算。
计算结果在一行内输出,保留小数点后两位。
输入样例:
1
2
3
2.4 3
0
输出样例:
1-Ball
2-Cylinder
3-Cone
other-Exit
Please enter your command:
Please enter the radius:
33.51
1-Ball
2-Cylinder
3-Cone
other-Exit
Please enter your command:
Please enter the radius and the height:
18.10
1-Ball
2-Cylinder
3-Cone
other-Exit
Please enter your command:
#include <stdio.h>
#include <stdlib.h> //包含exit()函数
#define PI 3.141592653579 //π
void menu(); //菜单栏
double ball(double r); //V-球
double cylinder(double r, double h); //V-圆柱
double cone(double r, double h); //V-圆锥
int main()
{
int n;
double r, h;
while (1)
{
menu();
scanf("%d", &n);
switch (n)
{
case 1:
printf("Please enter the radius:\n");
scanf("%lf", &r);
printf("%.2lf\n", ball(r));
break;
case 2:
printf("Please enter the radius and the height:\n");
scanf("%lf %lf", &r, &h);
printf("%.2lf\n", cylinder(r, h));
break;
case 3:
printf("Please enter the radius and the height:\n");
scanf("%lf %lf", &r, &h);
printf("%.2lf\n", cone(r, h));
break;
default:
exit(0); //直接退出
}
}
return 0;
}
void menu()
{
printf("1-Ball\n");
printf("2-Cylinder\n");
printf("3-Cone\n");
printf("other-Exit\n");
printf("Please enter your command:\n");
}
double ball(double r)
{
return ((double)4 / 3) * PI * r * r * r;
}
double cylinder(double r, double h)
{
return PI * r * r * h;
}
double cone(double r, double h)
{
return ((double)1 / 3) * PI * r * r * h;
}
7-188 龟兔赛跑
分数 5
作者 陈建海
单位 浙江大学
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式:
输入在一行中给出比赛时间T(分钟)。
输出格式:
在一行中输出比赛的结果:乌龟赢输出@@,兔子赢输出_,平局则输出--;后跟1空格,再输出胜利者跑完的距离。
输入样例:
242
输出样例:
@_@ 726
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int t,flag,rest,run;
int a,b;
cin >>t;
a=0;b=0;flag=0;rest=0;run=0;
while(t--){
if(run==10){ //兔子跑了十分钟就进行判断
if(b>=a) flag=1;
run=0;
}
a+=3;
if(!flag){ //兔子跑
b+=9;
run++;
}
else{ //兔子休息
rest++;
if(rest==30){
flag=0;
rest=0;
}
}
}
if(a==b)
cout <<"-_- "<<a<<endl;
else if(a>b)
cout <<"@_@ "<<a<<endl;
else
cout <<"^_^ "<<b<<endl;
return 0;
}
7-189 冒泡法排序
分数 5
作者 徐镜春
单位 浙江大学
将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。
本题要求对任意给定的K(<N),输出扫描完第K遍后的中间结果数列。
输入格式:
输入在第1行中给出N和K(1≤K<N≤100),在第2行中给出N个待排序的整数,数字间以空格分隔。
输出格式:
在一行中输出冒泡排序法扫描完第K遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。
输入样例:
6 2
2 3 5 1 6 4
输出样例:
2 1 3 4 5 6
#include<bits/stdc++.h>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
int n,k;
cin>>n>>k;
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<k;i++){
for(int j=0;j<n-i;j++){
if(a[j]>a[j+1]){
int d=a[j];
a[j]=a[j+1];a[j+1]=d;
}
}
}
for(int i=0;i<n;i++){
cout<<a[i];if(i==n-1)continue;
cout<<" ";
}
return 0;}
7-190 猴子选大王
分数 5
作者 徐镜春
单位 浙江大学
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
#!/usr/bin/python
# -*- coding: utf-8 -*-
N=int(input())
ls=[i for i in range(1,N+1)]
step=2 #步长
ptr=1
while len(ls) > 1:
#ptr表示列表中第几个元素,没有第0个元素,只有下标为0的元素
ptr=(ptr+step-1)%len(ls)+1
#ptr 是 下一个开始的位数
del ls[ptr-1]
print(ls[0])
7-191 删除字符串中的子串
分数 5
作者 白洪欢
单位 浙江大学
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。
输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
String s1=sc.nextLine();
String s2=sc.nextLine();
String s3=s1.replace(s2,"");
while(!s1.equals(s3)){
s1=s3;
s3=s1.replace(s2,"");
}
System.out.println(s3);
}
}
7-192 字符串的冒泡排序
分数 5
作者 陈越
单位 浙江大学
我们已经知道了将N个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的K(<N),输出扫描完第K遍后的中间结果序列。
输入格式:
输入在第1行中给出N和K(1≤K<N≤100),此后N行,每行包含一个长度不超过10的、仅由小写英文字母组成的非空字符串。
输出格式:
输出冒泡排序法扫描完第K遍后的中间结果序列,每行包含一个字符串。
输入样例:
6 2
best
cat
east
a
free
day
输出样例:
best
a
cat
day
east
free
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main() {
int n=0,k=0;
scanf("%d %d",&n,&k);
char s[n][11]; //n个长度为11的字符数组
int i=0;
for(;i<n;i++)
{
scanf("%s",s[i]);//仅由小写英文字母组成的非空字符串
}
int m=0;
for(;m<k;m++)//扫描k次 //每遍历一次就确定一个最大值,因此每次遍历的字符串的个数在减少
{
//先实现第一轮的比较,
char temp[11]={'0'};
for(i=0;i<n-1-m;i++)
{
int j=0; //利用ASCII码值进行比较,先比较第一个字母的ASCII值,要是相同再比较下一个字母的ASCII码值
for(;j<11;j++)//若第一个字符就能比较出结果就只会循环一次,若前面的字符都相同 ,则会循环到最后
{
if(s[i][j]>s[i+1][j])//前面一个字符串元素比后面大
{
strcpy(temp,s[i]);
strcpy(s[i],s[i+1]);
strcpy(s[i+1],temp);
break;//交换完毕跳出循环
}
else if(s[i][j]<s[i+1][j])//前面一个字符串元素比后面小
{
break;//有了结果就直接跳出
}
}
}
}
i=0;
for(;i<n;i++)
{
printf("%s",s[i]);
if(i!=n-1)
printf("\n");
}
return 0;
}
7-193 字符串循环左移
分数 5
作者 白洪欢
单位 浙江大学
输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
输入格式:
输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。
输出格式:
在一行中输出循环左移N次后的字符串。
输入样例:
Hello World!
2
输出样例:
llo World!He
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
string a;
getline(cin,a);
int n,i;
scanf("%d",&n);
n=n%a.size();
for(i=n;i<a.size();i++)
{
printf("%c",a[i]);
}
for(i=0;i<n;i++)
{
printf("%c",a[i]);
}
return 0;
}
7-194 说反话-加强版
分数 5
作者 陈越
单位 浙江大学
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
#include<iostream>
#include<string>
#include<sstream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
string str,temp;
vector<string> word;
getline(cin,str);//此处不能用cin进行输入,避免遇到空格就停止输入
stringstream ss;
ss<<str;//字符串放入流中
//利用stringstream流分割空格
while(ss>>temp)
{
word.push_back(temp);
}
reverse(word.begin(),word.end());//颠倒字符串数组
//输出结果
for(vector<string>::iterator it=word.begin();it!=word.end();it++)
{
if(it!=word.begin()) cout<<" ";//这种写法避免多余空格,避免出现格式错误
cout<<*it;
}
cout<<endl;
return 0;
}
7-195 整数分解为若干项之和
分数 5
作者 DS课程组
单位 浙江大学
将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,…。编程求出正整数N的所有整数分解式子。
输入格式:
每个输入包含一个测试用例,即正整数N (0<N≤30)。
输出格式:
按递增顺序输出N的所有整数分解式子。递增顺序是指:对于两个分解序列N
1
={n
1
,n
2
,⋯}和N
2
={m
1
,m
2
,⋯},若存在i使得n
1
=m
1
,⋯,n
i
=m
i
,但是n
i+1
<m
i+1
,则N
1
序列必定在N
2
序列之前输出。每个式子由小到大相加,式子间用分号隔开,且每输出4个式子后换行。
输入样例:
7
输出样例:
7=1+1+1+1+1+1+1;7=1+1+1+1+1+2;7=1+1+1+1+3;7=1+1+1+2+2
7=1+1+1+4;7=1+1+2+3;7=1+1+5;7=1+2+2+2
7=1+2+4;7=1+3+3;7=1+6;7=2+2+3
7=2+5;7=3+4;7=7
#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;
int flag = 0, n, a[35];
void dfs(int len, int pos, int next) //len当前长度,pos当前用了多大值,下一个要加的值的大小
{
if (pos + next > n)return; //如果值大于N就没有继续的必要了
a[len++] = next; //保存路径
if (pos+next == n){
cout << n << "=";
for (int i = 0; i < len; i++){
if (i == 0) cout << a[i];
else cout << "+" << a[i];
}
if (++flag % 4 == 0||next == n)cout << endl; //每输出四个一次回车
else cout << ";"; //每行输出最后一个不带分号
}
if (pos + next < n)
{
pos += next;
for (int i = next; i <= n - pos; i++)//根据规律得出后面的i>=next
dfs(len, pos, i);
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n / 2; i++) //i小于n/2,防止7=3+4、7=4+3该类情况
dfs(0, 0, i);
dfs(0, 0, n); //7=7的时候特殊处理
return 0;
}
7-196 数列求和-加强版
分数 5
作者 DS课程组
单位 浙江大学
给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。
输入格式:
输入数字A与非负整数N。
输出格式:
输出其N项数列之和S的值。
输入样例:
1 3
输出样例:
123
#include<stdio.h>
void sequencesum(int *p, int m, int n)
{
int i,t,num;
t = 0;
num = 0;
if(n == 0) //0个A,单独输出
{
printf("0");
}
else
{
for(i=n;i>=1;i--) //逆序存储,从最低位开始
{
p[t++] = n*m;
n = n-1;
}
t = t-1; //找到数组最后一个元素的下标
for(i=0; i<=t; i++) //用数组进位
{
num = p[i]/10;
p[i]=p[i]%10;
if(i != t)
{
p[i+1] = p[i+1]+num;
}
}
t = t+1; //数组最后一个下标的再下一个下标,此时为空,可以放数据
for(;num>0;) //把最高位往前推
{
p[t++] = num%10;
num = num/10;
}
for(i=t-1; i>=0; i--) // 逆序输出数组元素
{
printf("%d",p[i]);
}
}
}
int main()
{
int a[518028]; //int型数组最大容量
int A,N;
scanf("%d%d",&A,&N);
sequencesum(a, A, N);
return 0;
}
7-197 输出全排列
分数 7
作者 DS课程组
单位 浙江大学
请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。
输入格式:
输入给出正整数n(<10)。
输出格式:
输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a
1
,a
2
,⋯,a
n
排在序列b
1
,b
2
,⋯,b
n
之前,如果存在k使得a
1
=b
1
,⋯,a
k
=b
k
并且 a
k+1
<b
k+1
。
输入样例:
3
输出样例:
123
132
213
231
312
321
#include<stdio.h>
int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// 输出全排列
void print_permutation(int n)
{
int len = 1, i, pos, t, des;
while (1)
{
for (i = 0; i < n; i++)
{
printf("%d", a[i]);
}
printf("\n");
len = 1;
for (i = n-1; i > 0; i--)
{
if (a[i] > a[i-1])
{
pos = i-1;
break;
}
else
{
len++;
}
}
if (len == n)
break;
for (i = n-1; i >= n-len; i--)
{
if (a[pos] <= a[i])
{
des = i;
break;
}
}
t = a[des]; a[des] = a[pos]; a[pos] = t;
for (i = 1; i <= len/2; i++)
{
t = a[pos+i];
a[pos+i] = a[n-i];
a[n-i] = t;
}
}
}
int main()
{
int i, n;
scanf("%d", &n);
if (n == 1)
printf("1");
else
print_permutation(n);
return 0;
}
7-198 N个数求和
分数 6
作者 陈越
单位 浙江大学
本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。
输入格式:
输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 …给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式:
输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入样例1:
5
2/5 4/15 1/30 -2/60 8/3
输出样例1:
3 1/3
输入样例2:
2
4/3 2/3
输出样例2:
2
输入样例3:
3
1/3 -1/6 1/8
输出样例3:
7/24
#include<iostream>
#include<cmath>
using namespace std;
int GCD(int a, int b)//求最大公约数
{
if (b == 0)
return a;
else
return GCD(b, a%b);
}
int main()
{
int n, a, b, nume, deno, divisor;
//numerator 为和的分子,简写nume,denominator为和的分母,简写demo
scanf("%d%d/%d", &n, &nume, &deno);
for (int i = 1; i < n; i++)
{
scanf("%d/%d", &a, &b);
nume = nume * b + a * deno; //通分之后的分子
deno *= b; //通分之后的分母
divisor = GCD(abs(nume), abs(deno)); //divisor为最大公因数
nume /= divisor; //分子约分
deno /= divisor; //分母约分
}
// 如果是分母为负数,需要分子分母交换一下符号,输出时候如果分数是负数的话 负号要在前面
if (deno < 0)
{
deno = -deno;
nume = -nume;
}
if (nume && nume / deno == 0)
printf("%d/%d\n", nume, deno); //不能用if(nume<deno)通不过,用 abs(nume)<deno可以
else if (nume%deno == 0)
printf("%d\n", nume / deno); //如果nume=0,则包含在nume%deno==0这种情况中,这是一个测试点
else
printf("%d %d/%d\n", nume / deno, nume%deno, deno);
return 0;
}
7-199 A-B
分数 5
作者 陈越
单位 浙江大学
本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。
输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过10
4
,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。
输出格式:
在一行中打印出A−B的结果字符串。
输入样例:
I love GPLT! It’s a fun game!
aeiou
输出样例:
I lv GPLT! It’s fn gm!
#include <iostream>
#include<string>
using namespace std;
int main()
{
string str1, str2, str3;
//string类型不能使用cin输入空格,
getline(cin, str1);
getline(cin, str2);
for (int i = 0; i < str1.length() ; i++)
{
int n = 1;
for (int j = 0; j < str2.length() ; j++)
{
if (str2[j] == str1[i])
{
n = 0;
break;
}
}
if (n)
{
str3 = str3+str1[i];
}
}
cout << str3;
return 0;
}
7-200 天梯赛的善良
分数 6
作者 陈越
单位 浙江大学
天梯赛是个善良的比赛。善良的命题组希望将题目难度控制在一个范围内,使得每个参赛的学生都有能做出来的题目,并且最厉害的学生也要非常努力才有可能得到高分。
于是命题组首先将编程能力划分成了 10
6
个等级(太疯狂了,这是假的),然后调查了每个参赛学生的编程能力。现在请你写个程序找出所有参赛学生的最小和最大能力值,给命题组作为出题的参考。
输入格式:
输入在第一行中给出一个正整数 N(≤2×10
4
),即参赛学生的总数。随后一行给出 N 个不超过 10
6
的正整数,是参赛学生的能力值。
输出格式:
第一行输出所有参赛学生的最小能力值,以及具有这个能力值的学生人数。第二行输出所有参赛学生的最大能力值,以及具有这个能力值的学生人数。同行数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
10
86 75 233 888 666 75 886 888 75 666
输出样例:
75 3
888 2
n=int(input())
a=[eval(i) for i in input().split()]
a.sort()
print(a[0],a.count(a[0]))
print(a[len(a)-1],a.count(a[len(a)-1]),end='')