记录贴
顺序结构简单
求平方和
问题描述 :
从键盘输入x1和x2,输出x1^2+x2^2
输入说明 :
输入两个浮点数x1和x2,以空格分隔
输出说明 :
输出格式要求为:
小数点后保留4位,输出总共占10个字符的宽度(包括小数点),不足部分在左侧补空格。
如果数字本身超出10个字符的宽度,则按实际宽度输出。
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main ()
{
double x1,x2,c;
cin>>x1>>x2;
cin.get ();
c=x1*x1+x2*x2;//目前只能这样平方
cout<<right;//空左
cout<<fixed<<setprecision(4)<<setw(10)<<c<<endl;//四位小数,十字符
return 0;
}
自然语言优化如下:
#include <iostream>
#include <iomanip> // 头文件 <iomanip> 包含用于设置输出格式的函数
using namespace std;
int main()
{
double x1, x2;
cin >> x1 >> x2;
double c = x1 * x1 + x2 * x2;
cout << right << fixed << setprecision(4) << setw(10) << c << endl;
// 通过 setprecision 控制输出精度和 setw 控制输出宽度,使用 right 将数字靠右对齐
return 0;
}
变化如下:
删除了 cmath 头文件,因为程序中没有使用到相关函数;
删除了 cin.get(),因为在此处无需等待用户输入回车键;
使用 setw 函数设置输出宽度,将数字靠右对齐;
可以将 cout 中的 fixed、setprecision(4) 和 setw(10) 合并到一起,这样可以更清晰地表达意图。
数列和
问题描述 :
尝试求从1+2+…+N这N个自然数的和。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入一个整数N(1 ≤ N < 10,000);在行首和行尾没有多余的空格。在所有数据的前后,以及两组数据之间都没有多余的空行。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)输出对应的答案,其中仅有一个整数,即题目描述中的数列之和。在行首和行尾不要输出多余的空格。
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main ()
{
int N,Sn;
cin>>N;
cin.get ();
Sn=(N*(N+1))/2;//数列求和公式
cout<<Sn<<endl;
return 0;
}
优化:
#include <iostream>
using namespace std;
int main()
{
int N;
cin >> N;
int Sn = N * (N + 1) / 2; // 直接计算数列的和,无需使用 <cmath> 头文件
cout << Sn << endl;
return 0;
}
变化如下:
删除了 cmath 头文件,因为程序中没有使用到相关函数;
删除了 cin.get(),因为在此处无需等待用户输入回车键;
直接使用数列求和公式计算数列的和,无需使用循环来累加。
平均分
问题描述 :
从键盘输入三个学生的数学考试成绩,计算它们的平均分,保留两位小数。
输入说明 :
三个整数,数学成绩。
输出说明 :
平均分,保留2位小数。
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main ()
{
int a,b,c;
cin>>a>>b>>c;
cin.get ();
double d=(a+b+c)/3.0;//整型 浮点型 3.0,不然得不到浮点型
cout<<showpoint<<fixed<<setprecision(2)<<d<<endl;//小数点 保留2位小数
return 0;
}
改动:
#include <iostream>
#include <iomanip> // 头文件 <iomanip> 包含用于设置输出格式的函数
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b >> c;
double d = static_cast<double>(a + b + c) / 3; // 使用 static_cast 进行类型转换,避免精度损失
cout << fixed << setprecision(2) << d << endl; // 通过 setprecision 控制输出精度,无需使用 showpoint
return 0;
}
变化如下:
删除了 cmath 头文件,因为程序中没有使用到相关函数;
删除了 cin.get(),因为在此处无需等待用户输入回车键;
使用 static_cast 进行类型转换,将计算中的整数转换为浮点数,避免精度损失;
将 3.0 改为 3,避免出现不必要的浮点数运算;
删除了 showpoint,因为默认情况下会自动补齐小数点;
可以将 cout 中的 fixed 和 setprecision(2) 合并到一起,这样可以更清晰地表达意图。
解方程
问题描述 :
编写程序:输入a、b后,输出一元一次方程2*a*x+3*b-5=0的解。
输入说明 :
整数a b
输出说明 :
x 保留1位小数
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main ()
{
int a,b;
cin>>a>>b;
cin.get ();
double x=(5-3*b)/2.0/a;//整型 浮点型 2.0
cout<<showpoint<<fixed<<setprecision(1)<<x<<endl;//保留一位小数
return 0;
}
2:
#include <iostream>
#include <iomanip> // 头文件 <iomanip> 包含用于设置输出格式的函数
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
double x = static_cast<double>(5 - 3 * b) / (2 * a); // 使用 static_cast 进行类型转换,避免浮点数和整数运算时的精度损失
cout << fixed << setprecision(1) << x << endl; // 通过 setprecision 控制输出精度,无需使用 showpoint
return 0;
}
变化如下:
删除了 cmath 头文件,因为程序中没有使用到相关函数;
删除了 cin.get(),因为在此处无需等待用户输入回车键;
使用 static_cast 进行类型转换,将计算中的整数转换为浮点数,避免精度损失;
将 2.0 改为 2,避免出现不必要的浮点数运算;
删除了 showpoint,因为默认情况下会自动补齐小数点;
可以将 cout 中的 fixed 和 setprecision(1) 合并到一起,这样可以更清晰地表达意图。
顺序结构中等
华氏度转摄氏度
问题描述 :
明明第一次来到美国,有一次看到温度计上显示100度,吓了一跳,后来才知道美国使用华氏度。
明明就总在心里将华氏度转换成摄氏度,以知道温度到底有多高。
转换公式为:
摄氏度=5/9 *(华氏度-32)
请你帮他编写一个程序,当他告诉你一个华氏度时,你马上告诉他摄氏度是多少。
输入说明 :
输入一个数字,表示华氏度,可能是一个整数或者包含一位小数
输出说明 :
输出一个数字,保留一位小数。前后无多余空格或空行
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main ()
{
double Fc,Sl;
cin>>Fc;
Sl=(5*(Fc-32))/9.0;//表达式转换好后再输
cout<<fixed<<setprecision(1)<<Sl<<endl;
return 0;
}
2:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double Fc;
cin >> Fc;
double Sl = (5.0 / 9.0) * (Fc - 32.0); // 表达式转换
cout << fixed << setprecision(1) << Sl << endl;
return 0;
}
变化如下:
删除了 cmath 和 iomanip 头文件,因为程序中没有使用到相关函数;
将 Sl 的计算表达式转换为更加明确的形式,即先将 5 和 9 改为浮点型常量,以确保表达式中的所有数字都是浮点型,再进行计算;
在 cout 输出语句中,使用 fixed 和 setprecision 函数设置输出精度,以确保输出结果符合要求。
猪肉价格
问题描述 :
某市场的猪肉价格依据以下原则确定:根据周边三个菜场的猪肉价格,取一个平均值(保留一位小数)。
请从键盘输入三个价格,代表三个菜场的猪肉价格,计算得到该市场的猪肉价格。再输入需要买的猪肉重量,输出总价。
比如,三个市场的价格分别为:11.8、12、12.4,则计算得到的平均值为:12.0666667。四舍五入到小数点后一位,则为12.1。如果需要购买10斤猪肉,则总价为121元。
为实现四舍五入到小数点后一位,可使用如下算法:
首先将该数乘以10,然后加0.5,取整数部分,再除以10。
比如,输入1.37,乘以10得13.7,加0.5得到14.2,取整数部分为14,再除以10得到1.4。
再比如,输入1.32,乘以10得13.2,加0.5得到13.7,取整数部分为13,再除以10得到1.3。
输入说明 :
输入四个实数,分别表示三个菜场的猪肉价格及猪肉重量,四个数字以空格分隔。
输出说明 :
输出结果,保留两位小数。行首与行尾无多余空格
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main ()
{
double z1,z2,z3,g,x,y;
cin>>z1>>z2>>z3>>g;
cin.get ();
x=(z1+z2+z3)/3.0;//得到浮点数
y=(int(x*10+0.5))/10.0;//同上
cout<<fixed<<setprecision(2)<<y*g<<endl;
return 0;
}
2:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double z1, z2, z3, g;
cin >> z1 >> z2 >> z3 >> g;
double x = (z1 + z2 + z3) / 3.0;
double y = round(x * 10.0) / 10.0; // 使用 round 函数四舍五入保留一位小数
cout << fixed << setprecision(2) << y * g << endl;
return 0;
}
变化如下:
删除了 cmath 和 iomanip 头文件,因为程序中没有使用到相关函数;
在计算 x 和 y 的过程中,将 3 改为 3.0,以确保结果是浮点数;
使用 round 函数四舍五入保留一位小数,避免了将浮点数转换成整数的繁琐过程;
在 cout 输出语句中,使用 fixed 和 setprecision 函数设置输出精度,以确保输出结果符合要求。
字母ASCLL码的和
问题描述 :
输入三个英文字母,每个字母占一行。
将这三个字母看成对应的ASCII码,计算它们的和,并将该和除以3,得到一个商(整数)和一个余数(0或1或2)。
最后输出3个ASCII码的平均值,以及计算出来的商及余数。
输入的英文字母可包括小写及大写。
输入说明 :
输入三行,每行一个英文字母,无多余空格。
输出说明 :
输出一行,包括三个数字:
第一个是平均值,保留6位小数
第二个是计算出来的商
第三个是余数
三个数字之间以一个空格分隔,前后无多余空格
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main ()
{
char ch,ch1,ch2,ch3;
cin >>ch1;
cin.get(ch);
cin >>ch2;
cin.get(ch);
cin >>ch3;
cin.get(ch);//回车输入,有三种cin.get(ch);ch=cin.get();cin.get();
int x=((int)ch1+(int)ch2+(int)ch3);//转为整型
double y=x/3.0;//求浮点数
int z=x/3;
int h=x%3;
cout<<fixed<<setprecision(6)<<y;//6为小数
cout<<" "<<z<<" "<<h<<endl;
return 0;
}
2:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
char ch1, ch2, ch3;
cin >> ch1 >> ch2 >> ch3;
int x = ch1 + ch2 + ch3; // 不必强制类型转换为 int,可以直接将字符相加
double y = x / 3.0; // 将除数改为浮点数,避免整数除法
int z = x / 3;
int h = x % 3;
cout << fixed << setprecision(6) << y << " " << z << " " << h << endl;
return 0;
}
变化如下:
删除了 cmath 和 iomanip 头文件,因为程序中没有使用到相关函数;
将每个字符输入语句简化为一行,不必使用 cin.get(ch) 读取回车;
在计算 x 的过程中,不必将字符强制类型转换为 int,可以直接将字符相加,因为字符本质上就是一个整数;
将除数改为浮点数,避免整数除法得到错误的结果;
简化了 cout 输出语句,直接输出结果即可。
顺序结构困难
开根号
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
double a,b;
while(cin>>a)
{
b=sqrt(a);
cout<<fixed<<setprecision(6)<<b<<endl;
}
return 0;
}
求总分
问题描述 :
输入一个同学5门课的考试成绩,输出他各门课的成绩及总分。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由一行组成。输入的第一行有一个正整数N,表示有N组测试数据。其后N行,每行代表一个学生的成绩单。每个成绩单中包含5个非负整数,分别以空格隔开,每个整数代表一门课的成绩。每组输入数据间无空行。
输出说明 :
对于每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的文本终端)按照输入的顺序,对每个成绩单输出一行,其中包含6个整数:5门课分别的成绩(与输入顺序相同)和总成绩,每个成绩之间以空格隔开,所有数据前后没有多余的空行,两组数据之间也没有多余的空行。
#include<iostream>
using namespace std;
int main()
{
int N,n1,n2,n3,n4,n5,num;
cin>>N;
for(int i=0; i<N; i++)
{
cin >>n1>>n2>>n3>>n4>>n5;
num=n1+n2+n3+n4+n5;
cout<<n1<<" "<<n2<<" "<<n3<<" "<<n4<<" "<<n5<<" "<<num<<endl;
}
return 0;
}
分支结构简单
加班费
问题描述 :
编写一个计算员工收入的程序,公司规定工资发放标准:
160个工时以内10元/小时,160个工时以外按3倍发放。
输入说明 :
输入员工的工时数,1个整数。
输出说明 :
计算员工的收入
#include<iostream>
using namespace std ;
int main()
{
int worktime;
cin>>worktime;
if(worktime<=160)
cout<<worktime*10<<endl;
else
{
cout<<1600+(worktime-160)*30<<endl;
}
return 0;
}
数字字符转换
问题描述 :
编写程序进行数字字符转换。
从键盘读入字符ch,若ch中是数字字符'0'~'9',则'0'转换成'9','1'转换成'8','2'转换成'7',......,'9'转换成'0';若是其它字符则保持不变;
输出转换得到的结果。
输入说明 :
输入一个字符,包括英文字符、数字字符、各类符号等。
输出说明 :
输出转换的结果,也是一个字符。
#include<iostream>
using namespace std ;
int main()
{
char ch;
cin.get (ch);//输入ch,包括空格
if (ch<='9'&&ch>='0')
cout<<'9'-ch<<endl;
else
{
cout.put(ch);//输出
}
return 0;
}
字母排序
问题描述 :
输入三个字母,按字母表顺序输出这三个字母。
输入说明 :
三个字母
输出说明 :
按字母表顺序输出
#include<iostream>
using namespace std;
int main()
{
char ch1,ch2,ch3,chz;
cin>>ch1>>ch2>>ch3;
if(ch2>ch3)
{
chz=ch2;
ch2=ch3;
ch3=chz;//赋值进行排序
}
if(ch1<=ch2)
{
cout<<ch1<<ch2<<ch3<<endl;
}
else if(ch1<=ch3)
{
cout<<ch2<<ch1<<ch3<<endl;
}
else
cout<<ch2<<ch3<<ch1<<endl;
return 0;
}
判断奇偶
问题描述 :
从键盘输入一个整数,编程判断它的奇偶性。
输入说明 :
输入一个数字n
输出说明 :
输出n是奇数还是偶数。比如,输入数字5,则输出“5 is odd”;输入数字6,则输出“6 is even”*/
#include<iostream>
using namespace std ;
int main()
{
int n;
cin>>n;
if(n%2==0)
cout<<n<<" is even"<<endl;
else
{
cout<<n<<" is odd"<<endl;
}
return 0;
}
分支结构中等
逆序输出1到4位正整数
问题描述 :
输入一个不多于4位的正整数,要求按逆序打印出各个位上的数字,例如原数为23,应输出32;如原数为8000,应输出0008;如原数为1,则输出1。应测试以下情况:输入的数为1位、2位、3位、4位正整数;此外,还应测试以下异常情况:输入负数或0,或输入的数超过4位。
输入说明 :
输入一个整数,可能为0,也可能为负数。
输出说明 :
输入1到4位的正整数时,输出该数的逆序,如果是其它整数,则输出“error!”。输出时,行首与行尾均无空格。
#include <iostream>
using namespace std;
int main()
{
long long a,q,b,s,g;
cin>>a;
if(a>0&&a<=9999)
{
q=a/1000;
b=(a-q*1000)/100;
s=(a-q*1000-b*100)/10;
g=(a-q*1000-b*100)%10;
switch(q)
{
case 0:
switch(b)
{
case 0:
switch(s)
{
case 0:
cout<<g;
break;//不要忘记break
default:
cout<<g<<s;
}
break;
default:
cout<<g<<s<<b;
}
break;
default:
cout<<g<<s<<b<<q;
}
}
else
cout<<"error!";
return 0;
}
时间转换2
问题描述 :
给定一个t,将t秒转化为DD days HH:MM:SS的形式,表示DD天HH小时MM分钟SS秒。
HH,MM,SS均是两位数,如果小于10用0补到两位。
如果大于等于2天,则输出DD days HH:MM:SS,比如 2 days 01:05:12
如果大于等于1天并小于2天,则输出 1 day HH:MM:SS,比如 1 day 01:05:12
如果大于等于1小时并小于1天,则只输出HH:MM:SS,比如 01:05:12
如果大于等于1分钟并小于1小时,则只输出MM:SS,比如 01:00
如果大于等于10秒并小于1分钟,则只输出SS,比如 10
如果小于10秒,则只输出一位,表示秒数,比如 9
输入说明 :
输入一个数t,表示时间的秒数。
0<=t<100*24*60*60。
输出说明 :
输出格式形如:
86 days 00:02:12
表示86天0小时2分12秒。
其中“days”前后各有一个空格,行尾没空格。
详细描述见上。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
unsigned long long t;
cin>>t;
int d,h,m,s;
d=t/86400;
h=(t%86400)/3600;
m=((t%86400)%3600)/60;
s=(((t%86400)%3600)%60);
if(t<60)
cout<<t;
else if(t>=60&&t<3600)
cout<<setfill('0')<<setw(2)<<m<<":"<<setw(2)<<s;
else if(t>=3600&&t<86400)
cout<<setfill('0')<<setw(2)<<h<<":"<<setw(2)<<m<<":"<<setw(2)<<s;
else if(t>=86400&&t<172800)
cout<<setfill('0')<<d<<" day "<<setw(2)<<h<<":"<<setw(2)<<m<<":"<<setw(2)<<s;
else if(t>=172800)
cout<<setfill('0')<<d<<" days "<<setw(2)<<h<<":"<<setw(2)<<m<<":"<<setw(2)<<s;
return 0;
}
实数运算
问题描述 :
输入两个实数,求它们的和,差,积,商。
输入说明 :
输入数据由两行组成:第一行为两个实数a、b,它们以空格分隔,在行首和行尾没有多余的空格;第二行为运算符号'+'、'-'、'*'、'/'之一,在行首和行尾没有多余的空格。
输出说明 :
输出运算结果(保留一位小数),行首和行尾没有多余的空格,当除数为0时输出'Wrong!'。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double a,b;
char op;
cin>>a>>b;
cin.get();
cin>>op;
switch(op)
{
case '+':
cout<<fixed<<setprecision(1)<<a+b;
break;
case '-':
cout<<fixed<<setprecision(1)<<a-b;
break;
case '*':
cout<<fixed<<setprecision(1)<<a*b;
break;
case '/':
if(b==0)
cout<<"Wrong!";
else
cout<<fixed<<setprecision(1)<<a/b;
break;
}
return 0;
}
一个月的天数
问题描述 :
输入年和月,输出该月有几天。
输入说明 :
输入两个整数,中间以空格分隔,第一个整数表示年,第二个整数表示月。
输出说明 :
输出该年该月的天数,输出时,行首与行尾均无空格,仅输出一个整数。
#include <iostream>
using namespace std;
int main()
{
int year,mouth,day;
cin>>year>>mouth;
switch(mouth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day=31;
cout<<day;
break;
case 2:
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
cout<<"29";
else
cout<<"28";
break;
default:
day=30;
cout<<day;
}
return 0;
}
银行存款到期日
问题描述 :
银行存款有3个月、6个月定期等。从键盘输入一个日期(即为存款日期)以及定期的时间长度(单位为月,输入的时间长度可为小于等于60的任意正整数),请编程输出该定期存款的到期日期。 下面以3个月定期为例,说明定期的概念。
比如:
输入2014年4月30日,则到期日是2014年7月30日;
输入2014年3月31日,则到期日是2014年6月30日(6月没有31日,所以30日就到期);
输入2014年11月30日,则到期日是2015年2月28日;
输入2015年11月30日,则到期日是2016年2月29日。
输入说明 :
共输入4个整数,中间以空格分隔,第一个整数表示年,第二个整数表示月,第三个整数表示日,第四个整数表示定期长度(单位为月)。
输出说明 :
输出到期日期,共输出三个整数,中间以一个空格分隔,行首与行尾均无空格。
#include <iostream>
using namespace std;
int main()
{
int year,mouth,day,mouthtime;
int changey,changem;
cin>>year>>mouth>>day>>mouthtime;
changey=(mouth+mouthtime)/12;
changem=(mouth+mouthtime)%12;
year+=changey;
switch(changem)
{
case 4:
case 6:
case 9:
case 11:
if(day>30)
cout<<year<<" "<<changem<<" 30";
else
cout<<year<<" "<<changem<<" "<<day;
break;
case 2:
if (((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)&&day>28)
cout<<year<<" "<<changem<<" 29";
else if(((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)&&day<=28)
cout<<year<<" "<<changem<<" "<<day;
else if(day>28)
cout<<year<<" "<<changem<<" 28";
else
cout<<year<<" "<<changem<<" "<<day;
break;
default:
cout<<year<<" "<<changem<<" "<<day;
}
return 0;
}
分支机构困难
日期比较
写一个程序,输入两个合法日期,比较这两个日期哪个在日历中靠前。(具体输出格式见Output)
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据两行。
每组测试数据的第一行为第一个日期,日期的格式为dd mm yyyy,dd表示日,mm表示月,yyyy表示年,中间用一个空格隔开,
每组测试数据的第二行为第二个日期,格式与第一个日期一样,
每组测试数据的两个日期保证不同并且合法。
每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。
每组运算结果为一句话,格式如下:“01 01 1999 is earlier than 02 02 1999”。首先输出靠前的日期,接着输出“ is earlier than ”,然后再输出靠后的日期,注意,小于10的日期、月份之前要加0。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。
每一行的内部,用一个空格分隔各数据项。
注:通常,显示屏为标准输出设备
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int d1,m1,y1;
int d2,m2,y2;
while(cin>>d1>>m1>>y1>>d2>>m2>>y2)//输入多组数据,空格或换行
{
switch(y1>y2)//比较年份
{
case 0://y1<=y2
if(y1<y2)
{
cout<<setfill('0');
cout<<setw(2)<<d1<<" "<<setw(2)<<m1<<" "<<y1<<" is earlier than "<<setw(2)<<d2<<" "<<setw(2)<<m2<<" "<<y2<<endl;
}
else//y1=y2
switch(m1>m2)
{
case 0://m1<=m2
if(m1<m2)
{
cout<<setfill('0');
cout<<setw(2)<<d1<<" "<<setw(2)<<m1<<" "<<y1<<" is earlier than "<<setw(2)<<d2<<" "<<setw(2)<<m2<<" "<<y2<<endl;
}
else//m1=m2
switch(d1>d2)
{
case 0://d1<=d2
if(d1<d2)
{
cout<<setfill('0');
cout<<setw(2)<<d1<<" "<<setw(2)<<m1<<" "<<y1<<" is earlier than "<<setw(2)<<d2<<" "<<setw(2)<<m2<<" "<<y2<<endl;
}//此处可添加d1=d2的情况
break;//跳出
case 1:
cout<<setfill('0');
cout<<setw(2)<<d2<<" "<<setw(2)<<m2<<" "<<y2<<" is earlier than "<<setw(2)<<d1<<" "<<setw(2)<<m1<<" "<<y1<<endl;
break;
}
break;
case 1:
cout<<setfill('0');
cout<<setw(2)<<d2<<" "<<setw(2)<<m2<<" "<<y2<<" is earlier than "<<setw(2)<<d1<<" "<<setw(2)<<m1<<" "<<y1<<endl;
break;
}
break;
case 1:
cout<<setfill('0');
cout<<setw(2)<<d2<<" "<<setw(2)<<m2<<" "<<y2<<" is earlier than "<<setw(2)<<d1<<" "<<setw(2)<<m1<<" "<<y1<<endl;
break;
}
}
return 0;
}
可以将代码重构,避免使用 switch 嵌套多层的方式,提高代码可读性和可维护性。具体改进方法如下:
定义一个函数 compare(d1,m1,y1,d2,m2,y2),用来比较两个日期的先后顺序,返回值为 -1 表示第一个日期早于第二个日期,0 表示两个日期相等,1 表示第一个日期晚于第二个日期。
在主函数中,使用 compare 函数比较两个日期的先后顺序,根据返回值输出相应的结果。
在 compare 函数中,先比较年份,若不同则直接返回比较结果,否则比较月份,再比较日份,最后返回比较结果。
改进后的代码如下所示:
#include <iostream>
#include <iomanip>
using namespace std;
int compare(int d1, int m1, int y1, int d2, int m2, int y2) {
if (y1 != y2) {
return (y1 < y2) ? -1 : 1;
} else if (m1 != m2) {
return (m1 < m2) ? -1 : 1;
} else if (d1 != d2) {
return (d1 < d2) ? -1 : 1;
} else {
return 0;
}
}
int main() {
int d1, m1, y1;
int d2, m2, y2;
while (cin >> d1 >> m1 >> y1 >> d2 >> m2 >> y2) {
int result = compare(d1, m1, y1, d2, m2, y2);
if (result == -1) {
cout << setfill('0') << setw(2) << d1 << " " << setw(2) << m1 << " " << y1 << " is earlier than " << setw(2) << d2 << " " << setw(2) << m2 << " " << y2 << endl;
} else if (result == 0) {
cout << setfill('0') << setw(2) << d1 << " " << setw(2) << m1 << " " << y1 << " is the same day as " << setw(2) << d2 << " " << setw(2) << m2 << " " << y2 << endl;
} else {
cout << setfill('0') << setw(2) << d2 << " " << setw(2) << m2 << " " << y2 << " is earlier than " << setw(2) << d1 << " " << setw(2) << m1 << " " << y1 << endl;
}
}
return 0;
}
另外一种可能的改进方法是使用数组存储日期信息,然后通过比较数组元素的大小来判断日期的先后顺序。这样可以避免嵌套的 switch 语句,使代码更加简洁。
具体实现方法如下:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int date1[3], date2[3];
while (cin >> date1[0] >> date1[1] >> date1[2] >> date2[0] >> date2[1] >> date2[2]) {
bool earlier = false;
bool equal = true;
for (int i = 2; i >= 0; i--) {
if (date1[i] < date2[i]) {
earlier = true;
break;
}
else if (date1[i] > date2[i]) {
earlier = false;
break;
}
}
if (earlier) {
cout << setfill('0') << setw(2) << date1[0] << " "
<< setw(2) << date1[1] << " " << date1[2]
<< " is earlier than " << setw(2) << date2[0]
<< " " << setw(2) << date2[1] << " " << date2[2] << endl;
}
else if (equal) {
cout << setfill('0') << setw(2) << date1[0] << " "
<< setw(2) << date1[1] << " " << date1[2]
<< " is the same as " << setw(2) << date2[0]
<< " " << setw(2) << date2[1] << " " << date2[2] << endl;
}
else {
cout << setfill('0') << setw(2) << date2[0] << " "
<< setw(2) << date2[1] << " " << date2[2]
<< " is earlier than " << setw(2) << date1[0]
<< " " << setw(2) << date1[1] << " " << date1[2] << endl;
}
}
return 0;
}
在上述代码中,我们使用两个数组 date1 和 date2 来存储两个日期的信息,其中 date1[0] 表示日期1的日,date1[1] 表示日期1的月,date1[2] 表示日期1的年,date2[0]、date2[1]、date2[2] 同理。
在循环中,我们首先使用变量 earlier 和 equal 来分别记录两个日期的先后关系和相等关系,然后使用一个 for 循环从高位到低位逐个比较两个日期的元素,找到第一个不相等的元素后就可以确定两个日期的先后关系。
显示对应的数
问题描述 :
请跟据一个输入的整数,给出它的对应关系的名称。各个整数的对应关系如表:
输入数字
显示
1
A
2
B
3
C
4
D
5
E
其他
?
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据占一行,其中只包含一个整数n(0 ≤ n ≤ 9)。在行首和行尾没有多余的空格;所有数据前后没有多余的空行;两组数据之间没有多余的空行。在最后一组测试数据之后,有一个整数-1,表示输入数据的结尾。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的文本终端,例如你在Windows中启动该程序所用的命令行终端)依次输出一组对应的答案。每组答案占一行,其中只包含一个字符串,即题问描述中n对应的名称。在行首和行尾不要输出多余的空格;在所有数据的前后不要输出多余的空行;在两组数据之间不要输出多余的空行。
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
if(n==-1)//输入结束
{
cout<<endl;
}
else
switch(n)
{
case 1:
cout<<"A"<<endl;
break;
case 2:
cout<<"B"<<endl;
break;
case 3:
cout<<"C"<<endl;
break;
case 4:
cout<<"D"<<endl;
break;
case 5:
cout<<"E"<<endl;
break;
default:
cout<<"?"<<endl;
}
}
return 0;
}
求绝对值
问题描述 :
求实数的绝对值。
输入说明 :
输入数据有T组,每组占一行,每行包含一个实数,实数的有效数字不超过15位。
输出说明 :
对于每组输入数据,输出它的绝对值,要求每组数据输出一行,结果保留两位小数。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double r;
int n;
while(cin>>n)
for(int i=0;i<n;i++)
{
cin>>r;
if(r>=0)
cout<<fixed<<setprecision(2)<<r<<endl;
else
cout<<fixed<<setprecision(2)<<((-1)*r)<<endl;
}
return 0;
}
运费计算
问题描述 :
根据如下的折扣表计算运输费用,距离愈远,折扣越大。
依次输入每公里一吨的运价、货物重量及运输距离,求出实际运费。
折扣如下表所示。
运输距离s 折扣
S<250 0%
250≤S<500 2%
500≤S<1000 8%
1000≤S<2000 10%
2000≤S 15%
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由一行组成。
每组测试数据一行,由三个实数构成。第一个实数为每公里吨运价, 第二个实数为重量(单位为吨),第三个实数为距离,它们由空格符隔开。在行首和行尾没有多余的空格。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的文本终端)依次输出一组对应的答案。对应每一组输入的测试数据输出一行,其中只包含一个实数,即实际的运费。运费的值保留小数点后2位。在所有数据前后不要输出多余的空行,两组数据之间也不要输出多余的空行。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double price,weight,s;
while(cin>>price>>weight>>s)//输入多组数据,空格或换行
{
if(s<250)
cout<<fixed<<setprecision(2)<<price*weight*s<<endl;
else if(s>=250&&s<500)
cout<<fixed<<setprecision(2)<<price*weight*s*0.98<<endl;
else if(s>=500&&s<1000)
cout<<fixed<<setprecision(2)<<price*weight*s*0.92<<endl;
else if(s>=1000&&s<2000)
cout<<fixed<<setprecision(2)<<price*weight*s*0.90<<endl;
else if(s>=2000)
cout<<fixed<<setprecision(2)<<price*weight*s*0.85<<endl;
}
return 0;
}
循环结构简单
求最早和最晚日期
问题描述 :
输入N个日期,每个以年、月、日的顺序读入,打印输出最晚的日期、最早的日期。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由多行组成。每组测试数据的第一行输入一个整数N(0<N<20),表示有N个日期。其后N行每行有三个整数Y(1≤Y≤2015),M(1≤M≤12),D(1≤D≤31)表示一个日期。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的文本终端)输出两行,每行包括3个整数,第一行为最晚日期,第二行为最早日期,整数之间以一个空格分隔,行首与行尾无空格,所有数据前后没有多余的空行,两组数据之间也没有多余的空行。*/
#include<iostream>
using namespace std;
int main()
{
int Y,M,D,N;
int ey=2015,em=12,ed=31,ly=1,lm=1,ld=1;//定初值
cin>>N;
for(int i=0; i<N; i++)
{
cin>>Y>>M>>D;
if(ey>Y)
{
ey=Y;
em=M;
ed=D;
}
if(ly<Y)//错用成else if导致出bug
{
ly=Y;
lm=M;
ld=D;
}
}
cout<<ly<<" "<<lm<<" "<<ld<<endl;
cout<<ey<<" "<<em<<" "<<ed<<endl;
return 0;
}
以上代码虽然ac,但实际是错误的。
代码中的bug是在第二个if语句中使用了else if,导致最早日期的判断错误。当输入数据中既有早于当前最早日期的日期,又有晚于当前最晚日期的日期时,代码只会将最晚日期更新,而不会更新最早日期。应该将两个if语句独立出来,不使用else if。同时,最晚日期的初值应该设为最小值,最早日期的初值应该设为最大值。
改进后的代码如下:
#include <iostream>
using namespace std;
int main() {
int N, Y, M, D;
int latest_y = 0, latest_m = 0, latest_d = 0; // 最晚日期初值应设为最小值
int earliest_y = 9999, earliest_m = 12, earliest_d = 31; // 最早日期初值应设为最大值
cin >> N;
for (int i = 0; i < N; i++) {
cin >> Y >> M >> D;
if (Y > latest_y || (Y == latest_y && M > latest_m) || (Y == latest_y && M == latest_m && D > latest_d)) {
latest_y = Y;
latest_m = M;
latest_d = D;
}
if (Y < earliest_y || (Y == earliest_y && M < earliest_m) || (Y == earliest_y && M == earliest_m && D < earliest_d)) {
earliest_y = Y;
earliest_m = M;
earliest_d = D;
}
}
cout << latest_y << " " << latest_m << " " << latest_d << endl;
cout << earliest_y << " " << earliest_m << " " << earliest_d << endl;
return 0;
}
三种乘法表
输入一个整数n(1<=n<=9),表示输出n*n乘法表。
输出说明 :
输出三个n*n乘法表,乘法表中每一个数字均占4格(不足4格的左边补空格)。每一行的最后一个数字之后无空格。每个乘法表后有一个空行(空行中无空格)。 第三个乘法表中,第二行的4和第一行的2对齐,第三行的9和第二行的6对齐,依次类推。
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int n,i,j;
cin>>n;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
cout<<setw(4)<<i*j;
cout<<endl;
}//下三角
cout<<endl;
for(i=1; i<=n; i++)
{
for(j=1; j<=i; j++)
cout<<setw(4)<<i*j;
cout<<endl;
}//n*n
cout<<endl;
for(i=1; i<=n; i++)
{
for(j=1;j<i;j++)
cout<<" ";//填充,形成上三角
for(j=i; j<=n; j++)
cout<<setw(4)<<i*j;
cout<<endl;
}//上三角
return 0;
}
素数
问题描述 :
判断一个数是不是素数
输入说明 :
第一行为N
下面N行,每行一个数字n
输出说明 :
判断n是不是素数,是就输出yes,否则输出no
#include<iostream>
#include<cmath>
using namespace std;
bool determiningPrimeNumber(int n);
bool determiningPrimeNumber(int n)
{
for (int j = 2; j <= sqrt(n); j++)
{
if (n % j == 0)
return 0;
}
return 1;
}
int main()
{
int n,N;
cin>>N;
for(int i=0; i<N; i++)
{
cin>>n;
if (determiningPrimeNumber(n))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}
国际象棋棋盘问题
问题描述 :
在8×8的国际象棋的棋盘上,第一格放一粒米,第二格放二粒米,第三格放四粒米,第四格放八粒米,以此类推,后一格放的米粒的数量是前一格的两倍。请编写一个程序,求出前n格共需要几粒米。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。所有数据前后没有多余的空行,两组数据之间也没有多余的空行。每组数据一行,输入一个正整数n (1≤n≤60),在行首和行尾没有多余的空格。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备依次输出对应的结果。所有数据前后没有多余的空格,两组数据之间也没有多余的空行。每组输出数据由一行组成,输出前n格共需要放多少粒米。*/
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n;
unsigned long long counts=0;
while(cin>>n)
{
for(int i=1; i<=n; i++)
{
counts=pow(2,n)-1;
}
cout<<counts<<endl;
}
return 0;
}
幸运数字的因子个数
问题描述 :
小李非常喜欢数字4和7,看到一个数字他就想快速计算出因子里面含有几个4和7,但是智商捉急的他总是要算很久,喜欢编程的你能够帮助他吗?
比如数字112,因为112=4*4*7,所以知道它的因子中包含2个4和1个7。
再比如数字56,因为56=2*4*7,所以知道它的因子中包含1个4和1个7。
而数字30不能被4或7整除,所以它的因子中包含0个4和0个7。
输入说明 :
每组数据包含一行,每行包含一个整数n(3<=n<=2^30),表示给定的数字。
输出说明 :
对于每组输入,输出用空格隔开的两个数字,分别表示给定数字的因子中4和7的个数。
每组输出的首尾无多余空格,每组输出的前后也无多余空行。*/
#include<iostream>
using namespace std;
int main()
{
unsigned long long n;
int countFour,countSeven;
while(cin>>n)
{
for(countFour=0,countSeven=0;n>0;)
{
while(n%4==0)
{
countFour++;
n/=4;
}
while(n%7==0)
{
countSeven++;
n/=7;
}
break;
}
cout<<countFour<<" "<<countSeven<<endl;
}
return 0;
}
利滚利
问题描述 :
从键盘输入存款金额money,存期year和年利率rate,计算银行存款的本息
一年后的本息和的计算公式为: sum=money(1+rate),sum为本息合计,
每年结束时,将本息都继续存入银行。
需要计算year年后的本息合计。
输入说明 :
输入三个数,分别表示存款金额money,存期year和年利率rate,其中year为整数,其它两个为实数。
输出说明 :
本息合计,输出保留一位小数。
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int year;
double money,rate,sum;
cin>>money>>year>>rate;
for(int i=1; i<=year; i++)//从第一年开始
{
sum=money*(1+rate);
money=sum;
}
cout<<fixed<<setprecision(1)<<sum<<endl;
return 0;
}
工业产值翻倍
问题描述 :
假设今年的工业产值为100万元,产值增长率为每年c%,请编程计算过多少年可实现翻一番(即增加一倍或以上)。
输入说明 :
输入一个正整数c,表示增长率的百分比,1<=c<=20。
输出说明 :
输出一个整数,表示过多少年后产值可翻一番。在行首和行尾没有多余的空格。*/
#include<iostream>
using namespace std;
int main()
{
int c,i=0;
double price=100.0;//产值需要定义为实数,否则结果出错
cin>>c;
while(price<200)
{
price=price+price*c*0.01;
i++;
}
cout<<i<<endl;
return 0;
}
循环结构中等
abc数字
输入a,b,c三个一位数字,要求abc这样的一个三位数与cba这样的一个三位数相乘,输出其结果,再判断相乘后的结果中的数字中有多少位是与a、b、c相同的,并输出有几位相等。
输入说明 :
你写的程序要求从标准输入设备(通常,键盘为标准输入设备)中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行有三个正整数a、b、c,且a、b、c都为正整数,a、b、c中间用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备(通常,显示屏为标准输出设备)中。每组运算结果为两个整数,即abc和cba的乘积和有几位相等,两个数之间用一个空格隔开。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。*/
#include<iostream>
using namespace std;
int main()
{
unsigned long long a,b,c,x1,x2,result;
int count=0;
while(cin>>a>>b>>c)
{
x1=a*100+b*10+c;
x2=c*100+b*10+a;
result=x1*x2;
while(result)
{
if(result%10==a||result%10==b||result%10==c)
count++;
result/=10;
}
cout<<x1*x2<<" "<<count<<endl;
count=0;//重新赋值
}
return 0;
}
另一种方法
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int a,b,c;
while(cin>>a>>b>>c)
{
int t,a1,a2;
char a3[20];
a1=a*100+b*10+c;
a2=c*100+b*10+a;
t=a1*a2;
sprintf(a3,"%d",t);//把一个整数转换成字符串
int j=0;
for(int i=0; i<strlen(a3); i++)
{
if(a3[i]==(a+'0')||a3[i]==(b+'0')||a3[i]==(c+'0'))
{
j++;
}
}
cout<<t<<" "<<j<<endl;
}
return 0;
}
二进制表示位数
给定一个十进制整数,返回其对应的二进制数的位数。例如,输入十进制数9,其对应的二进制数是1001,因此位数是4。
输入说明 :
输入一个整数,大小在int表示范围内。
输出说明 :
一个整数
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int count=0;
if(n==0)
cout<<"1"<<endl;
else{
while(n>0){
n/=2;
count++;
}
cout<<count<<endl;
}
return 0;
}
满足条件的数字个数
问题描述 :
输入一个整数n (1≤n≤10000),求1到n中(包含1和n)能被3整除、且至少有一位数字是5的所有整数的个数。例如,252、54、525、555能被3整除,且至少有一位数字是5。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据占一行,其中包含:一个整数n(1≤n≤10000);在行首和行尾没有多余的空格。
输出说明 :
对每组测试数据,你的程序需要向标准输出文件(通常为启动该程序的终端)依次输出一组对应的答案。每个答案占一行,其中每行只包含一个整数,即1到n中(包含1和n)能被3整除、且至少有一位数字是5的所有整数的个数。在行首和行尾不要输出多余的空格。在所有数据前后,以及两组数据之间不要输出多余的空行。
#include<iostream>
using namespace std;
int main()
{
int n,count=0;
while(cin>>n)
{
for(int i=1; i<=n; i++)
{
if(i%3==0&&(i%10==5||(i/10)%10==5||(i/100)%10==5||(i/1000)%10==5))
count++;
}
cout<<count<<endl;
count=0;
}
return 0;
}
素数和
问题描述 :
求1~n之间所有素数的和
输入说明 :
第一行,输入N
以下N行,每行一个数字n(N<100,n<1000)
输出说明 :
N行,每行为1~n(包括n)之间素数的和
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int N,n,m,k,j,count=1;
while(cin>>N)
{
for(int i=0; i<N; i++)
{
cin>>n;
for(m=1; m<=n; m+=2)
{
k=sqrt(m);
for(j=2; j<=k; j++)
if(m%j==0)
break;
if(j>=k+1)
{
count+=m;
}
}
cout<<count<<endl;
count=1;
}
}
return 0;
}
二进制数数
问题描述 :
给定L,R。统计[L,R]区间内的所有数在二进制下包含的“1”的个数之和。
如5的二进制为101,包含2个“1”。
输入说明 :
第一行包含2个数L,R
1<=L<=R<=100000;
输出说明 :
一个数S,表示[L,R]区间内的所有数在二进制下包含的“1”的个数之和。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int L,R,S=0,i=0;
cin>>L>>R;
int t;
for(i=L; i<=R; i++) //从L到R
{
t=i;
while(t!=0)
{
S+=t%2;
t =t/2;
}
}
cout<<S<<endl;
return 0;
}
三角形
问题描述 :
“明明,你会用1到9这九个数字组成一个三角形吗?”明明的爸爸问明明。明明被问的很莫名其妙,不明白他爸爸在说什么,于是就问道:“用1到9组成三角形???”“是的,我的要求很简单,给你2个数,一个数作为这个三角形的开始,另一个数决定这个三角形的大小。例如我给你5和6这两个数,你就要组成如下的一个三角形:
5
6 7
8 9 1
2 3 4 5
6 7 8 9 1
2 3 4 5 6 7
明白了吗?”
明明观察了许久,终于看出了门道来,说道:“就是说给我2个数,例如5和6,那我就要从5这个数开始构建一个三角形。第一行为一个数字,第二行为2个数字,以此类推,直到第六行的六个数字,且三角形中的数字都是1到9在循环重复,是这样吗?”“明明真聪明,就是这样。”明明爸爸高兴的说道。于是明明的爸爸给了明明很多组这样的数字,明明也构建出了很多个不同的三角形。
你能像明明那样,写一个程序来构建上面的三角形吗?
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅有一行,每行有两个整数s和n(1≤s≤9,1≤n≤80),其中s表示位于三角形的最顶端的数字,n表示三角形由几行数字组成。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为构建出来的三角形,三角形中的同一行的数字两两之间用一个空格隔开。每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。
注:通常,显示屏为标准输出设备。
#include<iostream>
using namespace std;
int main()
{
int s,n,i=0,j=0,t=0;
while(cin>>s>>n)
{
cout<<s<<endl;
t=s;
for(i=2; i<=n; i++)
{
for(j=1; j<=i; j++)
{
t++;
if(t>9)
t=(t+1)%10;//+1跳过0
if(j==i)
cout<<t;
else
cout<<t<<" ";
}
cout<<endl;
}
}
return 0;
}
求阶乘结果0的个数
计算各乘数中因子5的个数
#include<iostream>
using namespace std;
int main()
{
int N,i=0,s=0,t=0;
cin>>N;
for(i=5; i<=N; i++)
{
t=i;
while(t>=5)
{
if(t%5==0)
{
s++;
t=t/5;
}
else
break;//跳出循环
}
}
cout<<s;
return 0;
}
数字串处理
问题描述 :
明明的爸爸经常对明明进行数学启蒙教育。有一天他和明明做了一个游戏,对一串数字进行处理。明明的爸爸首先给明明一串数字,在这串数字中有很多数字会连续重复出现很多次,爸爸就要求明明把其中连续重复出现次数最多的那个数字找出来。如果有很多个数字连续出现的次数相同,即重复出现次数最多的数字不止一个,那就要明明找出第一次出现该重复次数的那个数字。 例如有一串数字:2 2 2 1 1 1,其中2出现了3次,1也出现了3次,而明明要找出的那个数字是2,因为2是第一次重复出现3次的那个数字。 明明的爸爸现在已经设计好了很多组这样的数据,但是他不想自己来寻找,他想让你帮他写一个程序,找出出现次数最多的那个数字,然后他手中就有一份标准答案,可以用来检查明明到底做得对不对。 明明爸爸的问题可以归结为:给你一串数字,找出在这串数字中连续出现次数最多的那个数字;若有多个数字连续出现的次数相当,则找出第一次出现该次数的那个数字。
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据有2行,测试数据的第一行有1个整数n(1<n<100),表示数字串中有几个数;测试数据的第二行有n个数,数字串中的数字k,k(1 ≤k ≤100),每个数字之间用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为两个整数:出现次数最多的那整数,以及它的出现次数。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。
#include<iostream>
using namespace std;
int main()
{
int n,i=0,num[100] = {0};
int xCount = 0, maxCount = 1, maxIndex = 0;
while (cin>>n)
{
maxCount = 1;
maxIndex = 0;
for (i = 0; i < n; i++)
{
cin>>num[i];
}
for (i = 0; i < n - 1; )
{
if (num[i + 1] == num[i])
{
xCount = 2;
i += 2;
while (i < n && num[i] == num[i - 1])
{
xCount++;
i++;
}
if (maxCount < xCount)
{
maxCount = xCount;
maxIndex = i - 1;
}
}
else
{
i++;
}
}
cout<<num[maxIndex]<<" "<<maxCount<<endl;
}
return 0;
}
阿尔法乘积
问题描述 :
计算一个整数的阿尔法乘积。对于一个整数x来说,它的阿尔法乘积是这样来计算的:如果x是一个个位数,那么它的阿尔法乘积就是它本身;否则的话,x的阿尔法乘积就等于它的各位非0的数字相乘所得到的那个整数的阿尔法乘积。例如:4018224312的阿尔法乘积等于8,它是按照以下的步骤来计算的:
4018224312 → 4*1*8*2*2*4*3*1*2 → 3072 → 3*7*2 → 42 → 4*2 → 8
编写一个程序,输入一个正整数(该整数不会超过6,000,000,000),输出它的阿尔法乘积。
输入说明 :
输入只有一行,即一个正整数。
输出说明 :
输出相应的阿尔法乘积。
#include<iostream>
using namespace std;
int main()
{
unsigned long long x,t=1,s=10;
cin>>x;
if(x<10)
cout<<x;//个位数
else
{
while(s>=10)//判断是否还能求
{
t=1;
while(x)//求出一次
{
if(x%10!=0)
t*=x%10;
x/=10;
}
x=t;
s=t;//赋值判断
}
cout<<t;//注意输出语句位置,在else内输出
}
return 0;
}