文章目录
- 7.1 厘米换算英尺英寸
- 7.2 然后是几点
- 7.3 逆序的三位数
- 7-4 BCD解密
- 7.5 表格输出
- 7.6 混合类型数据格式化输入
- 7.7 12-24小时制
- 7-8 超速判断
- 7.9 用天平找小球
- 7.10 计算工资
- 7.11 分段计算居民水费
- 7.12 两个数的简单计算器
- 7.13 日K蜡烛图
- 7.14 求整数段和
- 7.15 计算圆周率
- 7-16 求符合给定条件的整数集
- 7.17 爬动的蠕虫
- 7.18 二分法求多项式单根
- 7.19 支票面额
- 7.20 打印九九口诀表
- 7.21 求特殊方程的正整数解
- 7.22 龟兔赛跑
- 7.23 币值转换
- 7.24 约分最简分式
- 7.25 念数字
- 7.26 单词长度
- 7.27 冒泡法排序
- 7.28 猴子选大王
- 7.29 删除字符串中的子串
- 7.30 字符串的冒泡排序
- 7.31 字符串循环左移
- 7.32 说反话-加强版
- 7.33 有理数加法
- 7.34 通讯录的录入与显示
- 7.35 有理数均值
- 7.36 四则运算
- 7.37 整数分解为若干项之和
- 7.38 数列求和-加强版
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 币值转换

要注意几个点:
- 从count开始后缀为0,不发声(但要警惕类似1300000的,不要忘记补上“万”)
- 0只发零不带权值
- 中间连续的0只发一个音
- 不要忘记最小的个位数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;
}
本文列举了浙江大学在线测评系统PTA中的一系列基础编程题目,涵盖长度单位转换、时间计算、逆序数字、BCD解密、表格输出等,旨在提升编程者的算法思维和实践能力。
1318

被折叠的 条评论
为什么被折叠?



