浙大PTA基础编程题目集(编程题)

本文列举了浙江大学在线测评系统PTA中的一系列基础编程题目,涵盖长度单位转换、时间计算、逆序数字、BCD解密、表格输出等,旨在提升编程者的算法思维和实践能力。

7.1 厘米换算英尺英寸

如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。

输入格式:
输入在一行中给出1个正整数,单位是厘米。

输出格式:
在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。

输入样例:170
输出样例:
5 6

题目不难,唯一算是难点的地方在于:解答者容易陷入题目所给公式的误区里,总想着把公式倒过来便能解决。
正确的解题思路是:
让输入的厘米除以30.48,便是带小数的英尺,直接取整便是所得英尺。
将小数部分乘以12并取整,便为英寸

(foot+inch/12)×0.3048 单位米
(foot+inch/12)×0.3048x100 单位㎝

#include <stdio.h>
int main()
{
    /*1英尺等于12英寸  
    (foot+inch/12)×0.3048 == 英尺 * 0.3048  == meter
    即   英尺 == meter /0.3048;    
        而英尺又由两部分组成(foot+inch/12) 整数部分的foot 以及小数部分的 (inch/12) 
        所以 meter /0.3048 取整即为 foot
         meter /0.3048 - foot 即为小数部分 inch/12  即小数部分为 12 *(meter /0.3048 - foot); 
    */ 
    int cm=0;
    scanf("%d",&cm);    //输入的cm
    int foot = cm/100.0/0.3048;  /* 1英尺等于30.48厘米 */
    int inch = (cm/100.0/0.3048 - foot) * 12;
    printf("%d %d",foot,inch);
    return 0;
}

7.2 然后是几点

有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数

输入格式:
输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530;0 点 30 分表示为 030。流逝的分钟数可能超过 60,也可能是负数。

输出格式:
输出四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。

输入样例:
1120 110

输出样例:
1310

#include<iostream>
using namespace std;
int main()
{
	int time,passtime;//注意passtime可能为负数 
	cin>>time>>passtime;
	int hour,minute;
	hour=time/100; //获取小时数 ,hour为最前两位 
	minute=time%100 ;//获取分钟数,分钟数为最后两位
	minute+=passtime;// minuet与add之和表示为:要增加多少分钟,或者是要减去多少分钟(add为负时)
	while(minute<0)	////如果此时minute为负,则说明hour要-1,minute要+60,直到 minute>0,注意要有加有减 
	{
		hour--;
		minute+=60; 
	}
	while(minute)
	{
		if(minute>=60)//如果此时minute>=60,则说明hour要+1,minute要-60,直到 0<=minute<60 
		{
			hour++;
			minute-=60;	
		}
		else 
			break;
	}
	cout<<hour;	//hour可直接输出 
	//因为输出规定为4位,minute要分类讨论
	if(minute==0) 	//当minute==0时,补2个0 
	{
		cout<<"00"<<endl;
	}
	else if(minute<=9)
	{
		cout<<minute<<"0";
	}
	else 
		cout<<minute;
}

7.3 逆序的三位数

程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。

输入格式:
每个测试是一个3位的正整数.

输出格式:
输出按位逆序的数。

输入样例:
123

输出样例:
321

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int a,b,c;
	a=n/100;	
	b=n/10%10;
	c=n%100%10;
	cout<<100*c+10*b+a;
	
}

7-4 BCD解密

BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!
现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
输入格式:
输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。
输出格式:
输出对应的十进制数。
输入样例:
18
输出样例:
12

在这里插入图片描述

#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;

    int a=n/16; //高位
    int b=n%16; //低位
    if(a==0&&b==0)cout<<0;
    else
    cout<<a<<b;
}

7.5 表格输出

没有一点技术含量,就是格式控制

#include<iostream>
int main() {
	std::cout << "------------------------------------\n";
	std::cout << "Province      Area(km2)   Pop.(10K)\n";
	std::cout << "------------------------------------\n";
	std::cout << "Anhui         139600.00   6461.00\n";
	std::cout << "Beijing        16410.54   1180.70\n";
	std::cout << "Chongqing      82400.00   3144.23\n";
	std::cout << "Shanghai        6340.50   1360.26\n";
	std::cout << "Zhejiang      101800.00   4894.00\n";
	std::cout << "------------------------------------\n";
	return 0;
}

7.6 混合类型数据格式化输入

在这里插入图片描述

直接输入输出就行,注意格式控制

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
	float a;
	int b;
	char c;
	float d;
	cin>>a>>b>>c>>d;
	cout<<c<<" "<<b<<" ";
	cout<<setiosflags(ios::fixed)<<setprecision(2)<<a<<" ";
	cout<<setiosflags(ios::fixed)<<setprecision(2)<<d;
	//c语言控制小数输出位数为printf("%c %d %.2f %.2f",c,b,a,d);
	return 0;
 } 

7.7 12-24小时制

在这里插入图片描述

注意刚好12点的情况,还有就是处理好输入的

调试输入测试样例的时候记得切换为英文模式,不然会出现蜜汁错误

//------------------------C++版-------------------------
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
	int hour,minute;
	char colon;
	cin>>hour>>colon>>minute;
	if(hour<12)//如果是上午,则不用转化时间,直接按格式输出即可
	{
		cout<< hour <<":"<< minute<<" AM"<<endl;//注意后面有一个空格 
	}
	else if(hour==12)//刚好是12点,注意这种情况
	{
		cout<< hour <<":"<< minute<<" PM"<<endl;
	}
	else//下午 
	{
		cout<<hour-12<<	":"<< minute<<" PM"<<endl;
	}
		 
 } 
//--------------------------C语言版-------------------
//直接在scanf的格式字符串中加入:,让scanf来处理这个冒号
#include<stdio.h>
int main() {
	int hour, minute;
	scanf("%d:%d", &hour, &minute);
	if (hour<12)  // 上午
	{
		printf("%d:%d AM", hour, minute);
	}
	else if(hour > 12) {  // 下午
		hour = hour - 12;
		printf("%d:%d PM", hour, minute);
	}
	else {  // 中午12点
		printf("%d:%d PM", hour, minute);
	}
	return 0;
}

7-8 超速判断

在这里插入图片描述

直接判断,注意输出要求就可以了。

#include<iostream>
using namespace std;
int main()
{
	int speed;
	cin>>speed;
	if(speed<=60)
	{
		cout<<"Speed: "<<speed<<" - OK"<<endl;
	 } 
	 else
	 cout<<"Speed: "<<speed<<" - Speeding"<<endl;
	
}
		 

7.9 用天平找小球

在这里插入图片描述

直接比较就可以,比两次就可以了,注意最后输出的不是重量,而是小球的标号

#include<iostream>
using namespace std;
int main()
{
	int A,B,C;	//3个小球的质量
	cin>>A>>B>>C;
	if(A==B)
	{
		cout<<"C"<<endl; 
	 } 
	 else if(B==C)
	 {
	 	cout<<"A"<<endl; 
	 }
	 else 
	 	cout<<"B"<<endl;
	return 0;
}
		 

7.10 计算工资

注意条件判断和输出控制即可

在这里插入图片描述

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
	int year,worktime;
	cin>>year>>worktime;
	double pay=0;
	int IsNew;		//判断是否为老员工
	if(year<5)
		IsNew=1;
	else IsNew=0;
	
	if(worktime<=40)
	{
		if(IsNew==1)
			{
				pay=worktime*30;
			}
			else
				pay=worktime*50;
	}
	else
		{
			if(IsNew==1)
			{
				pay=40*30+(worktime-40)*45;
			}
			else
				pay=40*50+(worktime-40)*75;
		}
	cout<<fixed<<setprecision(2)<<pay<<endl;
                     
	return 0;
}
		 

7.11 分段计算居民水费

在这里插入图片描述

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
	double x;
	cin>>x;
	double pay;
	if(x<15)
		pay=4*x/3;
	else
		pay=2.5*x-17.5;
	cout<<fixed<<setprecision(2)<<pay<<endl;
                     
	return 0;
}
		 

7.12 两个数的简单计算器

在这里插入图片描述

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
	int op1,op2;
	char sign;
	cin>>op1>>sign>>op2;
	if(sign=='+')
		cout<<op1+op2<<endl;
	else if(sign=='-')
		cout<<op1-op2<<endl;
	else if(sign=='*')
		cout<<op1*op2<<endl;
	else if(sign=='/')
		cout<<op1/op2<<endl;
	else if(sign=='%')
		cout<<op1%op2<<endl;
	else 
		cout<<"ERROR"<<endl;
}
		 

7.13 日K蜡烛图

这道题很长,但很多都是概念性的东西,实际上还是简单的条件判断,最后注意输出格式即可,特别是空格

在这里插入图片描述

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
	double  Open,High,Low,Close;
	cin>>Open>>High>>Low>>Close;
	if(Close<Open)
		cout<<"BW-Solid";
	
	if(Close>Open)
		cout<<"R-Hollow";
	
	if(Open==Close)
		cout<<"R-Cross";
	
	if(Low<Open&&Low<Close)
	{
		if(High>Open&&High>Close)
			cout<<" with Lower Shadow and Upper Shadow"<<endl;
		else cout<<" with Lower Shadow"<<endl;	
	}
	else if(High>Open&&High>Close)
	{
		if(Low<Open&&Low<Close)
			cout<<" with Lower Shadow and Upper Shadow"<<endl;
		else cout<<" with Upper Shadow"<<endl;	
	}
}
		 

7.14 求整数段和

注意格式控制,以及换行

在这里插入图片描述

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
	int A,B;
	cin>>A>>B;
	int sum=0;
	int n=0;
	for(int i=A;i<=B;i++)
	{
		sum=i+sum;
		n++;
		cout<<setw(5)<<setiosflags(ios::right)<<i;
		if(n%5==0)	//控制五个数字为一行 
			cout<<endl;	
	}
	if((B-A+1)%5!=0)	//判断最后一行是否为空行,避免出现两行空行或者没有换行的情况 
		cout<<endl;	
	cout<<"Sum = "<<sum;
}
		 

7.15 计算圆周率

在这里插入图片描述

因为题目说了阈值小于1,所以可以从第二项开始计算,判断公式中各项的关系

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
	double limit;
	cin>>limit;
	double n=1,halfPi=1;	//n为最后一项,halfPi为圆周率的一半 
	double num1=1;
	double num2=1;	//num1为分子,num2为分母 
	int i=2;
	while(n>=limit) 
	{
		num1=num1*(i-1);//不要直接用阶乘,否则超长整型 
		num2=num2*(2*i-1);
		n=num1/num2;
		halfPi=n+halfPi;
		i++;
	}
	cout<<fixed<<setprecision(6)<<halfPi*2;
}
	
		 

7-16 求符合给定条件的整数集

在这里插入图片描述

注意不能重复,行末不能有多余的空格

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
	int A;
	cin>>A;
	int n=0;
	for(int i=A;i<A+4;i++)
	{
		for(int j=A;j<A+4;j++)
			if(i!=j)	//判断百位数和十位数是否相等 
			{
					for(int k=A;k<A+4;k++)
				{	if(k!=i&&k!=j)	//判断是否有重复数字 
					{
						cout<<i<<j<<k;
						n++;
						if(n%6==0)	//判断是不是行末,不是行末就输出空格,是行末就换行 
							cout<<endl;
						else 
							cout<<" ";
					}
					
				}
			}
		
	}
}
	
		 

7.17 爬动的蠕虫

在这里插入图片描述

主要是要判断在下滑的时候是否已经到达了井口

#include<iostream>
using namespace std;
int main()
{
	int N,U,D;
	cin>>N>>U>>D;
	int min=0,sum=0;
	while(sum<N)
	{
		sum=sum+U;
		if(sum<N)	//判断有没有刚好到井口 ,如果到了,就完成任务,不用休息和后退 
			{
				sum=sum-D;
				min=min+2;
			}
		else 
			min++;
	}
	cout<<min<<endl;
	
}

7.18 二分法求多项式单根

在这里插入图片描述

#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
double a3,a2,a1,a0;
double ff(double x)	//多项式 
{
	return a3*pow(x,3)+a2*pow(x,2)+a1*x+a0;
}
int main()
{
	
	cin>>a3>>a2>>a1>>a0;
	double a,b;
	int flag=0;
	cin>>a>>b;
	while(b-a>0.001)
	{
		
		if(ff(a)*ff(b)<0)
			if(ff((a+b)/2)==0)
				{
					cout<<fixed<<setprecision(2)<<(a+b)/2<<endl;
					flag=1;
					break;
				}
			
		if(ff((a+b)/2)*ff(a)>0)	//判断是否同号 
		{
			a=(a+b)/2;
		}
		else
			b=(a+b)/2;	
	}
	if(flag==0)	//如果一开始就小于给定阈值,则直接输出区间中点(a+b)/2;
		cout<<fixed<<setprecision(2)<<(a+b)/2<<endl;
	return 0;
}

7.19 支票面额

在这里插入图片描述

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int CanSolve=0;
	for(int f=0;f<100;f++)	//双重循环判断 
		for(int y=0;y<100;y++)
		{
			if(100*f+y-n==2*(100*y+f))	//判断是否有解 
			{
				CanSolve=1; 
				cout<<y<<"."<<f<<endl;
			} 
			
		}
		if(CanSolve==0)
			cout<<"No Solution"<<endl;	 
	return 0;
}

7.20 打印九九口诀表

在这里插入图片描述

#include<stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)	//双重循环控制 
	{
		for(int j=1;j<=i;j++)
		{
			printf("%d*%d=%-4d",j,i,i*j);
		}
		printf("\n");	
	}
	return 0;
}

7.21 求特殊方程的正整数解

在这里插入图片描述

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n; 
	int CanSolve=0;
	for(int x=1;x*x<=n;x++)	//双重循环控制 
	{
		for(int y=1;y*y<=n;y++)
		{
			if(x*x+y*y==n&&x<y)
			{
				cout<<x<<" "<<y<<endl;
				CanSolve=1;
			}
				
		}
	}
	if(CanSolve==0)
		cout<<"No Solution"<<endl;
	return 0;
}

7.22 龟兔赛跑

在这里插入图片描述

#include<iostream>
using namespace std;
int main()
{
	int t;
	cin>>t; 
	int flag=0,rest=0,run=0;
	int tortoise=0,rabbit=0;
	while(t--)
	{
		tortoise=tortoise+3;	//乌龟一直在跑 
		if(run==10)//兔子跑了十分钟就进行判断
		{
			if(tortoise<=rabbit)	
				flag=1;		//表示兔子要休息了 
			run=0;	//无论是否休息,都要重新开始计算奔跑时间 
		}
		if(flag==0) //兔子跑 
		{
			rabbit+=9;
			run++;
		}
		else		//兔子休息 
		{
			rest++;
			if(rest==30)	
			{
				flag=0;
				rest=0;
			}
						 
		} 		
	}				
	if(tortoise>rabbit)	
		cout<<"@_@"<<" "<<tortoise<<endl;
	else if(tortoise<rabbit)
		cout<<"^_^"<<" "<<rabbit<<endl;
	else
		cout<<"-_-"<<" "<<rabbit<<endl;
	return 0;
}

7.23 币值转换

在这里插入图片描述

要注意几个点:

  1. 从count开始后缀为0,不发声(但要警惕类似1300000的,不要忘记补上“万”)
  2. 0只发零不带权值
  3. 中间连续的0只发一个音
  4. 不要忘记最小的个位数0
#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	if(n==0)	//输入为0的情况 
	{
		cout<<'a';
		return 0;
	}
	int s[9];	//每个位置,不超过9位数 
	for(int i=0;i<9;i++)	//每个位置初始化	
	{
		s[i]=-1;
	}
	int flag=1;//标记末尾的0;
	int count=8;//判断哪个位置是0
	//拆开数字,放入数组
	for(int i=8;n>0;i--) 
	{
		s[i]=n%10;
		if(s[i]!=0&&flag==1)
		{
			count=i;
			flag=0;	
		} 
		n=n/10;
	}
	int ZeroContinue=0;	//检测是否有多个零
	for(int i=0;i<=count;i++)
	{
		if(s[i]==-1)
			continue;
		//是0的情况,且是万位,而且不是类似100000001的情况,此时不输出0只输出W	
		else if(s[i]==0&&i==4&&(s[1]>0||s[2]>0||s[3]>0))
		{
			cout<<'W';
			continue;
		}
		switch(s[i])
		{
            case 0:if(ZeroContinue==0)cout<<'a';break;
            case 1:cout<<'b';break;
            case 2:cout<<'c';break;
            case 3:cout<<'d';break;
            case 4:cout<<'e';break;
            case 5:cout<<'f';break;
            case 6:cout<<'g';break;
            case 7:cout<<'h';break;
            case 8:cout<<'i';break;
            case 9:cout<<'j';break;
            default:break;
		} 
		 if(s[i]!=0)//零处除了万其他时候权值不发音
            switch(i){
                case 0:cout<<'Y';break;
                case 1:cout<<'Q';break;
                case 2:cout<<'B';break;
                case 3:cout<<'S';break;
                case 4:cout<<'W';break;
                case 5:cout<<'Q';break;
                case 6:cout<<'B';break;
                case 7:cout<<'S';break;
				default:break;
            	}
        else if(s[i]==0) //如果这次是0,那么下次遇到零就不发音
			ZeroContinue=1;	
	 
	 } 
	 if(count>0&&count<4)cout<<'W';//最后给因为后缀是0而忽略万的数补上W
	return 0;
	
}

7.24 约分最简分式

在这里插入图片描述

用循环找到公约数即可

#include<stdio.h>
int main ()
{
    int numerator,denominator;
    scanf("%d/%d",&numerator,&denominator);
    for(int i=denominator;i>=2;i--)
    {
    	if(denominator%i==0&&numerator%i==0)	//判断是否为公约数
		{
			denominator/=i;
			numerator/=i;
		} 
	}    
	printf("%d/%d",numerator,denominator);
	return 0;
}	

7.25 念数字

在这里插入图片描述

把输入的数字当成字符处理即可,注意输出格式

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
	char py[10][5]={"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
	char a[1005];
	cin>>a;
	if(a[0]=='-')
	{
		cout<<"fu";
	}
	else
	{
		cout<<py[a[0]-'0'];	//输出数字对应的拼音 
	}
	for(int i=1;i<strlen(a);i++)
	{
		cout<<" "<<py[a[i]-'0']; //末尾没有空格 
	 } 
	 cout<<endl;
}
	
 

7.26 单词长度

在这里插入图片描述

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
	string s;
	getline(cin,s);
	int len=s.length();
	int count=0;
	int temp=0;	//控制空格格式 
	if(len==1)	//输入的为. 表示为空语句,什么都不输出,直接返回 
		return 0;
	for(int i=0;i<len;i++)
	{
		if(s[i]=='.')	//到了结尾 
		{
			if(count!=0)	//前面有字母 
			{
				if(temp!=0) 
					cout<<" ";
				cout<<count;
			}
		}
		else if(s[i]!=' ')	//没有碰到空格 
		{
			count++;
		}
		else
		{
			if(count!=0)
			{
				if(temp!=0)
				{
					cout<<" ";
				}
				cout<<count;
				temp++;
			}
			count=0;
		 } 
		 
	 } 
}
	
	
 

7.27 冒泡法排序

在这里插入图片描述

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
	
 int n,k;
 cin>>n>>k;
 int a[105];
 for(int i=0;i<n;i++)
 {
 	cin>>a[i];
 }
 for(int i=0;i<k;i++)
 {
 	for(int j=0;j<n-1;j++)	//注意是n-1 
 	{
 		if(a[j]>a[j+1])
 		{
 			swap(a[j],a[j+1]);		
		 }
	}
 }
 cout<<a[0];
 for(int i=1;i<n;i++)
 {
 	cout<<" "<<a[i];
 }
} 

7.28 猴子选大王

在这里插入图片描述

这是一个典型的约瑟夫环问题
这个问题有很多种解法,例如:
公式法
链表法
数组法

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
 int n;//人的总数 
 cin>>n;
 bool *p=new bool[n+1] ;//[1......n]为true表示此人还没被淘汰 
 for(int i=1;i<=n;i++) 	//初始化
 {
 	p[i]=true; 
 } 
 int count=0;	//统计淘汰的人数
 int j=0;
 for(int i=1;;i++) 
 {
 	if(p[i])	//这个人还没被淘汰
	 {
	 	j++; 
	 	if(j==3)
	 	{
	 		p[i]=false;	//报数到3,这个人被淘汰 
	 		j=0;
	 		count++;
		 }
		if(count==n)
		{
		 	cout<<i<<endl;	
		 	break;
		} 
	 } 
	 if(i==n) //到结尾了,再次循环 
		i=0;
	 
 }
 delete []p;
 return 0; 
} 

7.29 删除字符串中的子串

在这里插入图片描述

//用string自带的函数很方便
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
	
	string s1,s2;
	getline(cin,s1);
	getline(cin,s2);
	while(s1.find(s2)<s1.length())	//判断s1中是否存在s2
	{
		s1=s1.erase(s1.find(s2),s2.length());	//将s1中的s2删除 
	 } 
	 cout<<s1; 
 return 0; 
 
} 

其他方法:删除子串

7.30 字符串的冒泡排序

在这里插入图片描述

算法是一样的,只不过将数字换成字符串而已

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
	int n,k;
	string a[105];
	cin>>n>>k;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<k;i++)
	{
		for(int j=0;j<n-1;j++)
		{
			if(a[j]>a[j+1])
				swap(a[j+1],a[j]);
		}
	}
	for(int i=0;i<n;i++)
	{
		cout<<a[i]<<endl;
	}
 return 0; 
 
} 

7.31 字符串循环左移

在这里插入图片描述

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
	string s;
	int n;
	getline(cin,s);
	int len=s.length();
	char temp;
	cin>>n;
	while(n--)
	{	
		temp=s[len-1];//把最后的字符保存 
		s[len-1]=s[0];	//把第一个字符放在最后的位置,循环左移 
		for(int i=1;i<len-1;i++)
		{
			s[i-1]=s[i];	// 把剩下的字符依次往前移 
		}
		s[len-2]=temp;	//倒数第二个位置放之前保存的最后一个字符		
	}
	for(int i=0;i<len;i++)
		{
			cout<<s[i]; 
		}
 return 0; 
 
} 

7.32 说反话-加强版

在这里插入图片描述

每个串之间都有空格,一个或者多个。这样用单纯的scanf %s 或是 cin 这种遇空格结束的字符串读入方法直接就忽略了中间空格。

这样每次cin>>s ,s都是一个子字符串,把一个子字符串看作栈的一个元素,一个一个入栈。最后再后进先出,输出出来,这就完啦

#include<bits/stdc++.h>
using namespace std;
 
string s[1000000];
string a;
int top=0;
int main()
{
	while(cin>>a)
	{
		s[++top] = a;
	}
	for(int i=top;i>=1;i--)
	{
		if(i==top)	cout<<s[i];
		else		cout<<" "<<s[i];
	}
	return 0;
}

其他思路

7.33 有理数加法

在这里插入图片描述

先找出最少公倍数,做加法,然后再做约分

#include<iostream>
using namespace std;
int main()
{
	int a1,a2,b1,b2;
	scanf("%d/%d",&a1,&b1);
	scanf("%d/%d",&a2,&b2);
	int temp=0;
	for(int i=b2;;i++)
	{
		if(i%b2==0&&i%b1==0)	//找出分子分母的最小公倍数 
		{
			temp=i;
			break;
		} 
	}
	a1=(temp/b1)*a1;
	b1=temp;
	a2=(temp/b2)*a2;
	b2=temp;
	int sum1,sum2;
	sum1=a1+a2;
	sum2=b1;
	for(int i=sum2;i>=2;i--)
	{
		if(sum2%i==0&&sum1%i==0)	//判断是否为公约数
		{
			sum1/=i; 
			sum2/=i;
			
		} 	
	}
	if(sum2==1)
	{
		cout<<sum1;
	}
	else
		cout<<sum1<<"/"<<sum2;
} 

7.34 通讯录的录入与显示

在这里插入图片描述

#include<iostream>
using namespace std;
struct phone	//通信录结构体 
{
	string name;
	string birthday;
	string sex;
	string tel;
	string fix_tel;
};
int main()
{
  int n;
  cin>>n;
  phone a[n];  //通信录数组	
  for(int i=0;i<n;i++) 
  {
  	cin>>a[i].name>>a[i].birthday>>a[i].sex>>a[i].fix_tel>>a[i].tel;
  }
  
  int k;
  cin>>k;
  int b[k];	//需要查找到数组 
  for(int i=0;i<k;i++) 
  {
  	cin>>b[i];
  }
  int p;
  for(int i=0;i<k;i++)
  {	
  		p=b[i];
  		if(i==k-1)	//最后一个
		  {
		  	if(p<n&&p>=0) 
		  	{
		  		cout<<a[p].name<<" "<<a[p].fix_tel<<" "<<a[p].tel<<" "<<a[p].sex<<" "<<a[p].birthday;
			}
			else
				cout<<"Not Found"; 		 	
		  } 
		else
		{
		if(p<n&&p>=0) 
		  	{
		  		cout<<a[p].name<<" "<<a[p].fix_tel<<" "<<a[p].tel<<" "<<a[p].sex<<" "<<a[p].birthday<<endl;
			}
			else
				cout<<"Not Found"<<endl; 		 	
		  } 	
 }
}
 

7.35 有理数均值

在这里插入图片描述

#include<iostream>
using namespace std;
struct shu	//通信录结构体 
{
	int zi;
	int mu;
};
void huajian(int &zi,int &mu) 
{
	for(int i=zi;i>=2;i--)
	{
		if(zi%i==0&&mu%i==0)
		{
			zi/=i;
			mu/=i;
			break;
		}
	}
}
int main()
{
  int n;
  cin>>n;
  shu num[110],sum;
  
  for(int i=0;i<n;i++) 
  {
  	scanf("%d/%d",&num[i].zi,&num[i].mu);
  }
  sum.mu=1;sum.zi=0;
  for(int i=0;i<n;i++) //逐个相加并化简 
  {
  	sum.zi=sum.zi*num[i].mu+num[i].zi* sum.mu;
  	sum.mu=sum.mu*num[i].mu;
  	huajian(sum.zi,sum.mu);
  }
    sum.mu*=n;	//要求均值 
	huajian(sum.zi,sum.mu);   //求均值 
	if(sum.mu==1)
	{
		printf("%d",sum.zi);
	}
	else if(sum.zi==0)
	{
		printf("0");
	}
	else{
		printf("%d/%d",sum.zi,sum.mu);
	}
  
}
 

7.36 四则运算

在这里插入图片描述

#include<stdio.h>//特别 
#include <math.h>
#define ZERO 0.1
double a1,b1,a2,b2;
double a3,b3;
int show(double a,double b,int c);
int he(){
    a3=a1+a2;
    b3=b1+b2;
    printf("(");
    show(a1,b1,0);
    printf(") ");
    printf("+");//运算符 
    printf(" (");
    show(a2,b2,0);
    printf(") = ");
    show(a3,b3,1);
    return 0;
}
int cha(){
    a3=a1-a2;
    b3=b1-b2;
    printf("(");
    show(a1,b1,0);
    printf(") ");
    printf("-");//运算符 
    printf(" (");
    show(a2,b2,0);
    printf(") = ");
    show(a3,b3,1);
    return 0;
}
int ji(){
    a3=a1*a2-b1*b2;
    b3=a1*b2+a2*b1;
    printf("(");
    show(a1,b1,0);
    printf(") ");
    printf("*");//运算符 
    printf(" (");
    show(a2,b2,0);
    printf(") = ");
    show(a3,b3,1);
    return 0;
}
int shang(){
    a3=(a1*a2+b1*b2)/(a2*a2+b2*b2);
    b3=(-a1*b2+a2*b1)/(a2*a2+b2*b2);
    printf("(");
    show(a1,b1,0);
    printf(") ");
    printf("/");//运算符 
    printf(" (");
    show(a2,b2,0);
    printf(") = ");
    show(a3,b3,1);
    return 0;
}
 
int show(double a,double b,int c){//遇到浮点数比较误差了 
//通过相减之差是否足够接近零来判断是否相等
//不相等的话直接用大于号小于号判断大小
//精度丢失跟大于小于一点关系都没有。
//第三个测试点纯实数运算,当虚部等于零的时候输出时前面也要加正号!!
//注意结果和运算初值显示还是不同的 ,这个题目提醒我,题目要循着某种规律才能做对,
//一般人会把初值和结果分开 ,还是题意理解的问题,初值是否和结果遵循同样的显示手段 
    
    int flag=0; 
    if (c && fabs(a)<ZERO && fabs(b)<ZERO)
    { 
        printf("0.0"); 
        return 0; 
    }
    if(c && fabs(a)>=ZERO){//a!=0 
        flag=1;
        printf("%.1f", a);
    }
    if(c && fabs(b)>=ZERO){
        if(flag && b>0)
        printf("+%.1fi", b);
        else
        printf("%.1fi", b);
    }
    if(c!=1){
        printf("%.1f", a);
        if(b<0)
        printf("%.1fi", b);
        else
        printf("+%.1fi", b);
    }
    return 0;
}
int main(){//用结构体的时候?确实不愿意搞复杂,正如某些引入栈的题解,当然算法就是要拿来用的 
    scanf("%lf %lf %lf %lf",&a1,&b1,&a2,&b2);//读入4个字符
    //要确保输出格式 ,如果结果的实部或者虚部为0,则不输出。题目只保证C2不为0 
//如果结果为0,则输出0.0。 
    he();
    printf("\n");
    cha();
    printf("\n");
    ji();
    printf("\n");
    shang();
    return 0;
}

参考网址

7.37 整数分解为若干项之和

在这里插入图片描述

题解:用dfs搜索,因为所有加法因子都是由小到大的,dfs(number,n,location,sum)中第一个参数就是记录当前因子的大小。

#include<stdio.h>
int cnt=0;
 int n,a[50];
void dfs(int number, int n, int location, int sum){//第一个参数为当前因子的大小。
    if(sum==n){
        printf("%d=", n);
        for(int i=0;i<location; ++i)
            if(i==0)
            printf("%d",a[i]);
             else
             printf("+%d",a[i]);
        ++cnt;
        if(cnt%4!=0&&number!=n)
            printf(";");
        if(cnt%4==0&&cnt!=0)
            printf("\n");
    }
    if(sum>n) return;
    for(int i=number;i<=n;++i){
        a[location]=i;
        dfs(i,n,location+1,sum+i);
    }
}
int main()
{
    scanf("%d",&n);
    dfs(1,n,0,0);
}

参考网址

7.38 数列求和-加强版

在这里插入图片描述

在这里插入图片描述

#include<iostream>
using namespace std;
int main()
{
	int a,n;
	cin>>a>>n;
	int num[100005]={0};
	int sum=0,temp;
	if(n==0)
	{
		cout<<"0"<<endl;
	}
	for(int i=0;i<n;i++)
	{	
		
		sum=a*(n-i)+sum; 
		num[i]=sum%10;	 
		sum=sum/10;	//存进位 
		
	}
	if(sum!=0)	//看是否有进位 
		cout<<sum;
	for(int j=n-1;j>=0;j--)
		cout<<num[j];
	return 0;
}
C语言参考答案汇总(浙江大学城市学院) 第2周(M2) 2 20011求华氏温度100°F对应的摄氏温度。 2 20012 求华氏温度 150°F 对应的摄氏温度。 3 20013求摄氏温度26°C对应的华氏温度。 3 20015当n为152时,分别求出n的个位(digit1)、十位(digit2)和百位(digit3)的值。 3 20026 输入2个整 num1 和 num2,计算并输出它们的和、差、积、商与余。 4 第3周(M3) 5 20031 求1+2+3+......+100(调试示例error02_5) 5 20032 求m+(m+1)+(m+2)+......+100 5 20033 求1/m+1/(m+1)+1/(m+2)+......+1/n 6 20034 求1 + 1/3 + 1/5 + ......的前n项和 7 20035 求1-1/4+1/7-1/10+……的前n项之和 7 20036 输出华氏-摄氏温度换表(改错题error02_6) 8 20038 求x的n次幂 9 20041 生成 3 的乘方表 10 20044 求100^0.5+101^0.5+……+1000^0.5 10 20053 计算物体自由下落的距离 11 20056 计算分段函 11 20061 阶梯电价 12 20062 求m*m+1/m+(m+1)*(m+1)+1/(m+1)(m+2)*(m+2)+1/(m+2)+......+n*n+1/n 13 20063 求1-2/3+3/5-4/7+5/9-6/11+…… 14 20064 求2^1+2^2+2^3+……+2^n 15 第4周(M4) 15 10007 显示图案 (复习printf()的字符串输出) 15 20042 生成阶乘表 16 20043 使用函求 n! /(m!* (n-m)!) 16 20054 求平均值 17 20057 求1+1/2+1/3+......+1/n 18 20065 求0!+1!+2!+……+n! 18 40015 求最小值 19 40018 求a+aa+aaa+aa…a 20 第5周(M5) 21 30001 求一元二次方程的根 21 30002 求分段函的值 23 30003 分类统计字符 23 30004 显示五级记分制成绩所对应的百分制成绩区间(使用switch) 24 30005 显示水果的价格(使用switch) 25 30007 求三角形的面积和周长 27 30008 计算个人所得税 28 30051 判断闰年 29 30052 统计学生平均成绩与及格人 30 30053 分段计算水费(使用嵌套的if-else语句) 31 第6周(M6) 32 40011 求最小公倍和最大公约(调试示例error04_1) 32 40012 求1-1/4+1/7-1/10+1/13-1/16+…… 33 40014 求整的位 34 40023 换硬币 35 40024 找出各位字的立方和等于它本身的 36 40025 找完(改错题error04_2) 38 40027 从高位开始逐位输出一个的各位(选作) 39 40052 判断素 40 40053 逆序输出整 41 40054 输出斐波那契序列 42 第7周(M7) 42 50002 使用函判断的符号 42 50003 使用函求奇和 43 50005 使用函统计素并求和 44 50006 使用函统计一个字的个 45 50007 使用函找水仙花 46 50009 使用函求余弦函的近似值 48 50052 使用函找最大值 49 50062 使用函输出指定范围内的 Fibonacci 50 50063 使用函找出指定范围内的完 51 第8周(M8) 52 40013 求奇和 52 40062 求x+x*x/2!+x*x*x/3!+x*x*x*x/4!+……的值 53 50004 使用函计算两点间的距离 54 50061 使用函求a+aa+aaa+aa…a 55 60002 整的十进制、八进制和十六进制表现形式 56 60003 分类统计字符 57 60006 验证歌德巴赫猜想 58 60007 使用函输出整的逆序 59 60009 统计单词 60 60062 简单计算器 61
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值