浙江大学 PTA 程序 第五部分 高空坠球 打印菱形图案 猴子吃桃问题 兔子繁衍问题 简单计算器 统计一行文本的单词个数

本文主要是介绍浙江大学 PTA 程序 第五部分 高空坠球 打印菱形图案 猴子吃桃问题 兔子繁衍问题 简单计算器 统计一行文本的单词个数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

习题4-8 高空坠球 (20 分)

皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?

输入格式:

输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。

输出格式:

在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。

输入样例:

33 5

输出样例:

94.9 1.0

程序  不解释

#include "stdio.h"
int main()
{int i,n;double high,dis=0.0;scanf("%lf%d",&high,&n);dis=high;for(i=1;i<n;i++){dis+=high;high/=2.0;}printf("%.1lf %.1lf\n",dis,high/2);return 0;
}

习题4-9 打印菱形图案 (15 分)

本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。

输入格式:

输入在一行中给出一个正的奇数n。

输出格式:

输出由n行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。

输入样例:

7

输出样例:

      * * * * * * * * * 
* * * * * * * * * * * * * * * * 
#include "stdio.h"
int main()
{int i,j,k,n;scanf("%d",&n);for(i=0;i<n;i++){if(i<=n/2) //输出中心线及以上部分 {for(j=n/2;j>i;j--)  printf("  "); //输出空格 for(k=0;k<i*2+1;k++) printf("* ");//输出 ‘*’ printf("\n");}else //输出中心线以下部分 {for(j=i;j>n/2;j--)  printf("  ");//输出空格for(k=0;k<(n-i)*2-1;k++) printf("* ");//输出 ‘*’ printf("\n");}}return 0;
}

习题4-10 猴子吃桃问题 (15 分)

一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?

输入格式:

输入在一行中给出正整数N(1<N≤10)。

输出格式:

在一行中输出第一天共摘了多少个桃子。

输入样例:

3

输出样例:

10
#include "stdio.h"
int main()
{int i,n,res=1; //res记录第N天剩下的桃子 scanf("%d",&n);for(i=n-1;i>0;i--) //循环n-1次  res=(res+1)*2;     //计算出第一天摘得桃子数量 printf("%d\n",res); //输出结果 return 0;
}

习题4-11 兔子繁衍问题 (15 分)

一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?

输入格式:

输入在一行中给出一个不超过10000的正整数N。

输出格式:

在一行中输出兔子总数达到N最少需要的月数。

输入样例:

30

输出样例:

9
#include "stdio.h"
int main()
{//繁衍规律是 1 1 3 5 8 13 21...... 每天兔子的数量都是前两天数量之和 int i,n,sub1=1,sub2=1,t; //sub1 当天兔子的数量 sub2 前一天兔子的数量 t 临时存储当天兔子的数量 scanf("%d",&n);for(i=3;;i++) //循环  {t=sub1;sub1+=sub2;sub2=t;if(sub1>=n) break; //达到数量则停止增加,得到天数  i }     printf("%d\n",i); //输出结果 //printf("第 %d 天兔子的数量:%d\n",i,sub1); //输出当天兔子的数量 return 0;
}

习题6-7 简单计算器 (20 分)

模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。

输入格式:

输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。

输出格式:

在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

输入样例:

1+2*10-10/2=

输出样例:

10
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int main()
{int x,i=0,j=0,m=0,a[100]={0};char c[100]={0},y,b[100]={0},*p;//获取表达式,存入b[] p=b; //指针指向字符串数组 while((y=getchar())!='=')*p++=y;p=b; //指针回字符串首地址//将数字和计算符号分开存储到 a[]数组 和 c[] 字符串 while(*p!='\0'){x=*p-'0';		//将输入的字符逐一转换为 ascii码 与 '0'比较,  if(x>=0&&x<=9)  //连续的数字字符转化为 int 数据 {m=m*10+x;	//每获取一个 int数据 加到 m*10  p++;		//指针移到下一个字符 }else			//不是数字字符 则将已经得到的数字存储在 a[] 数组中,非数字字符存储在 c[] 字符串中 {a[j]=m;		//得到的数字存储在 a[] 数组中c[j]=*p;	//得到的非数字字符存储在 c[] 字符串中m=0;		//回初始值,为下一个数据做准备j++;		//下标 +1p++;		//指针移到下一个字符}}a[j]=m;				//得到的最后一个数字存储到 a[] 数组中//以下按顺序开始计算 m=a[0]; //将计算结果存储在 m 中,第一个数值 a[0] 赋给 m for(i=0;i<=j;i++){if(c[i]=='\0') 		//没有符号,输出计算结果 {	printf("\n%d\n",m); return 0;}else if(c[i]=='+') m+=a[i+1];				//加法计算 else if(c[i]=='-') m-=a[i+1];				//没减法计算else if(c[i]=='*') m*=a[i+1];				//乘法计算else if(c[i]=='/'&&a[i+1]!=0) m/=a[i+1];	//除数不为 ‘0’ ,除法计算 else 										//除数为 ‘0’ ,或者非法运算符 输出  "ERROR"{printf("\nERROR\n"); return 0;}} }

拓展部分1:先乘除后加减(整数计算)

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
/*声明函数**定义全局变量*/ 
void shuru(char *pb);					 //获取表达式 
void fenzu(int *pa,char *pb,char *pc);	 //拆分表达式
void youxian(int *pa,char *pb,int n);	 //处理优先级计算 
void zhcjs(int *pa,char *pb,char *pc,int n); //最终计算及输出
int count=0;//定义全局变量 count 用来记录 计算次数 
menu_0() //提示信息 
{printf("\n***********简单计算器***************\n\n");	printf("\t【】任意键开始计算\n\t【】退出 e \n\n");printf("**********计算表达式以'='结束*********\n\n");}
int main()
{ if(count==0)  //提示信息只显示 1 次 menu_0(); int a[100]={0},n;char b[100]={0},c[100]={0},y;//printf("exit ?\n\n") ; y=getchar();if(y=='e') exit(0);	//获取字符,'e' 则退出 fflush(stdin); //清除缓存,准备接收表达式 shuru(b);fenzu(a,b,c);n=strlen(c);youxian(a,c,n);zhcjs(a,b,c,n);}
/*****************	获取表达式,存入b[] **********/
void shuru(char *pb)
{char y;printf("表达式:");  while((y=getchar())!='=')*pb++=y;printf("\n\n");
}
/*****************将数字和计算符号分开存储到 a[]数组 和 c[] 字符串 **********/
void fenzu(int *pa,char *pb,char *pc)
{int x,m=0,j=0;while(*pb!='\0'){x=*pb-'0';	//将输入的字符逐一转换为 ascii码 与 '0'比较,  if(x>=0&&x<=9) //连续的数字字符转化为 int 数据 {m=m*10+x;//每获取一个 int数据 加到 m*10  pb++;	//指针移到下一个字符 }else//不是数字字符 则将已经得到的数字存储在 a[] 数组中,非数字字符存储在 c[] 字符串中 {*(pa+j)=m;	//得到的数字存储在 a[] 数组中*(pc+j)=*pb;//得到的非数字字符存储在 c[] 字符串中m=0;	//回初始值,为下一个数据做准备j++;	//下标 +1pb++;	//指针移到下一个字符}}*(pa+j)=m;	//得到的最后一个数字存储到 a[] 数组中
}
/*****************处理优先计算  '*'   '/'  *******************/	
//将乘除运算的结果存储到运算符号之后的数值所在空间,前面的数值清零 ,符号位赋值 '+' 
void youxian(int *pa,char *pc,int n)
{int i;for(i=0;i<=n;i++){if(*(pc+i)=='*') //乘法计算{ *(pa+i+1)=*(pa+i) * *(pa+i+1);//所得数值赋给后面可以继续参与后续乘除运算	*(pa+i)=0;if(*(pc+i-1)=='-')	*(pc+i)='-';else*(pc+i)='+';}				if(*(pc+i)=='/'&&*(pa+i+1)!=0) //除数不为 ‘0’ ,除法计算 {*(pa+i+1)=*(pa+i) / *(pa+i+1);//所得数值赋给后面可以继续参与后续乘除运算	*(pa+i)=0;if(*(pc+i-1)=='-')	*(pc+i)='-';else*(pc+i)='+';}} 	
}
/********************以下按顺序开始计算*******************************/
void zhcjs(int *pa, char *pb, char *pc, int n)
{	int i,m;m=*(pa+0); //将计算结果存储在 m 中,第一个数值 a[0] 赋给 m for(i=0;i<=n;i++){if(*(pc+i)=='\0') //没有符号,输出计算结果 {	printf("计算结果: %d\n\n",m);}else if(*(pc+i)=='+') m+=*(pa+i+1);	//加法计算 else if(*(pc+i)=='-') m-=*(pa+i+1);	//没减法计算else if(*(pc+i)=='*') m*=*(pa+i+1);	//乘法计算else if(*(pc+i)=='/'&&*(pa+i+1)!=0) m/=*(pa+i+1);//除数不为 ‘0’ ,除法计算 else //除数为 ‘0’ ,或者非法运算符 输出  "ERROR"{printf("\nERROR\n\n");break;}	} count++; fflush(stdin);main();	
}

拓展部分2:先乘除后加减(实数计算,结果保留2位小数)

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
/*声明函数**定义全局变量*/ 
void shuru(char *pb);	//获取表达式 
void fenzu(double *pa,char *pb,char *pc);//拆分表达式
void youxian(double *pa,char *pb,int n);//处理优先级计算 
void zhcjs(double *pa,char *pb,char *pc,int n);	//最终计算及输出
int count=0; //定义全局变量 count 用来记录 计算次数 
menu_0()//提示信息 
{printf("\n***********简单计算器***************\n\n");	printf("\t【】任意键开始计算\n\t【】退出 e \n\n");printf("********计算表达式以'='结束**********\n\n");}
int main()
{ if(count==0)  //提示信息只显示 1 次 menu_0(); double a[100]={0},n;char b[100]={0},c[100]={0},y;//printf("exit ?\n\n") ; y=getchar();if(y=='e') exit(0);	//获取字符,'e' 则退出 fflush(stdin); //清除缓存,准备接收表达式 shuru(b);fenzu(a,b,c);n=strlen(c);youxian(a,c,n);zhcjs(a,b,c,n);}
/*****************	获取表达式,存入b[] **********/
void shuru(char *pb)
{char y;printf("表达式:");  while((y=getchar())!='=')*pb++=y;printf("\n\n");
}
/*****************将数字和计算符号分开存储到 a[]数组 和 c[] 字符串 **********/
void fenzu(double *pa,char *pb,char *pc)
{double x,m=0;int j=0;while(*pb!='\0'){x=*pb-'0';	//将输入的字符逐一转换为 ascii码 与 '0'比较,  if(x>=0&&x<=9) //连续的数字字符转化为 int 数据 {m=m*10+x;//每获取一个 int数据 加到 m*10  pb++;//指针移到下一个字符 }else//不是数字字符 则将已经得到的数字存储在 a[] 数组中,非数字字符存储在 c[] 字符串中 {*(pa+j)=m;//得到的数字存储在 a[] 数组中*(pc+j)=*pb;//得到的非数字字符存储在 c[] 字符串中m=0;	//回初始值,为下一个数据做准备j++;	//下标 +1pb++;	//指针移到下一个字符}}*(pa+j)=m;//得到的最后一个数字存储到 a[] 数组中
}
/*****************处理优先计算  '*'   '/'  *******************/	
//将乘除运算的结果存储到运算符号之后的数值所在空间,前面的数值清零 ,符号位赋值 '+' 
void youxian(double *pa,char *pc,int n)
{int i;for(i=0;i<=n;i++){if(*(pc+i)=='*') //乘法计算{ *(pa+i+1)=*(pa+i) * *(pa+i+1);//所得数值赋给后面可以继续参与乘除运算	*(pa+i)=0;if(*(pc+i-1)=='-')	*(pc+i)='-';else*(pc+i)='+';}				if(*(pc+i)=='/'&&*(pa+i+1)!=0) //除数不为 ‘0’ ,除法计算 {*(pa+i+1)=*(pa+i) / *(pa+i+1);//所得数值赋给后面可以继续参与乘除运算	*(pa+i)=0;if(*(pc+i-1)=='-')	*(pc+i)='-';else*(pc+i)='+';}} 
}
/********************以下按顺序开始计算*******************************/	
void zhcjs(double *pa, char *pb, char *pc, int n)
{int i;double m;	m=*(pa+0); //将计算结果存储在 m 中,第一个数值 a[0] 赋给 m for(i=0;i<=n;i++){if(*(pc+i)=='\0') //没有符号,输出计算结果 {	printf("计算结果: %.2lf\n\n",m); //精度保留 2 位小数,可修改}else if(*(pc+i)=='+') m+=*(pa+i+1);	//加法计算 else if(*(pc+i)=='-') m-=*(pa+i+1);	//没减法计算else if(*(pc+i)=='*') m*=*(pa+i+1);	//乘法计算else if(*(pc+i)=='/'&&*(pa+i+1)!=0) m/=*(pa+i+1);//除数不为 ‘0’ ,除法计算 else //除数为 ‘0’ ,或者非法运算符 输出  "ERROR"{printf("\nERROR\n\n");break;}	} count++; fflush(stdin);main();	
}

习题6-8 统计一行文本的单词个数 (15 分)

本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。

输入格式:

输入给出一行字符。

输出格式:

在一行中输出单词个数。

输入样例:

Let's go to room 209.

输出样例:

5
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
main()
{char a[100]={0},*p;int count=0;gets(a);//获取字符串 p=a;//指针指向获取字符串首地址 while(*p!='\0')//遍历字符串 {	if(*p==' ')//遇到空格 {while(*p==' ')//遇到空格,指针下移,直到遇到非空格 {p++;}	}else{while(*p!=' '&&*p!='\0') //遇到非空格,指针下移 ,直到遇到空格 {p++;}count++;//计数 +1 }	}printf("%d\n",count);//输出计数参量 return 0;	
}

 

这篇关于浙江大学 PTA 程序 第五部分 高空坠球 打印菱形图案 猴子吃桃问题 兔子繁衍问题 简单计算器 统计一行文本的单词个数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/626631

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

spoj705( 求不相同的子串个数)

题意:求串s的不同子串的个数 解题思路:任何子串都是某个后缀的前缀,对n个后缀排序,求某个后缀的前缀的个数,减去height[i](第i个后缀与第i-1 个后缀有相同的height[i]个前缀)。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstrin

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o