pta初级题库151-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='')

  • 7
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值