东华oj自用 26-30
阶乘最后的非0位
问题描述
N的阶乘写作N!表示小于等于N的所有正整数的乘积。阶乘会很快的变大,如13!就必须用32位整数类型来存储,70!即使用浮点数也存不下了。你的任务是找到阶乘最后面的非零位。举个例子,5!=1*2*3*4*5=120所以5!的最后面的非零位是2,7!=1*2*3*4*5*6*7=5040,所以最后面的非零位是4。
输入说明
一个不大于1000的整数N。
输出说明
共一行,输出N!最后面的非零位。
解题思路:
算N的阶乘的过程中去掉后面的0,并保留后四位,最后结果对10取余得到最后面的非零位
初始代码:
#include
int main(){
int N;
int sum=1;
scanf("%d",&N);
for(int i=1;i<=N;i++){
sum*=i;
while (sum % 10 == 0){
sum /= 10;
}
sum %=10000;
}
int result=sum%10;
printf("%d",result);
return 0;
}
AC代码:同上
错误反思:
算菜价
问题描述
妈妈每天都要出去买菜,但是回来后,兜里的钱也懒得数一数,到底花了多少钱真是一笔糊涂帐。现在好了,作为好儿子(女儿)的你可以给她用程序算一下了,呵呵。
输入说明
输入含有一些数据组,第一行第一个数是测试组数,第二行第一个数据是菜种数,每组数据包括菜种(字串),数量(计量单位不论,一律为double型数)和单价(double型数,表示人民币元数),因此,每组数据的菜价就是数量乘上单价啊。菜种、数量和单价之间都有空格隔开的。
注意样例输入应是如下:
1
3
青菜 1 2
罗卜 2 1.5
鸡腿 2 4.2
输出说明
支付菜价的时候,由于最小支付单位是角,所以总是在支付的时候采用四舍五入的方法把分头去掉。所以,请输出一个精度为角的菜价总量。
解题思路:
sum记录菜价和
初始代码:
int main(){
int T;
int N;
char cai;
int count;
float jiage;
scanf("%d
",&T);
for (int i=1;i<=T;i++){
scanf("%d
",&N);
float sum=0;
for (int j=1;j<=N;j++){
scanf("%c %d %f",&cai,&count,&jiage);
sum+=count*jiage;
}
printf("%.1f",sum);
}
return 0;
}
二次调整
数量double型,将
int count;
float jiage;修改为
float count,jiage;
题目说明菜种是字符串(字串),不是单个字符
char cai;
......
scanf("%c %d %f",&cai,&count,&jiage);修改为
char cai[100];
......
scanf("%s %d %f",cai,&count,&jiage);
AC代码:
#include
int main(){
int T;
int N;
char cai[100];
float count,jiage;
scanf("%d
",&T);
for (int i=1;i<=T;i++){
scanf(" %d
",&N);
float sum=0;
for (int j=1;j<=N;j++){
scanf("%s %f %f",cai,&count,&jiage);
sum+=count*jiage;
}
sum = (int)(sum * 10 + 0.5) / 10.0;
printf("%.1f
",sum);
}
return 0;
}
错误反思:
水果价格
问题描述
一家水果店出售四种水果,每公斤价格的苹果(代码为a)1.5元,橘子(代码为o)1.4元,香蕉(代码为b)1.48元,菠萝(代码为p)1.08元。编一个程序,使售货员只要在键盘上打入货品的代码及重量,计算机将显示货品名、单价、重量及总价。
输入说明
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。
每组测试数据的第一行为一个整数m,表示有m件货品要被购买。在接下来的m行中,每行输入两个值d,g。d表示货品的代码,g表示重量。两组数据之间没有多余的空行。
输出说明
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)依次输出一组对应的答案。对应每组输入,输出货品名、单个总价及全部总价。具体格式参照样例输出:第一行apple前为7个空格,之后为2个空格,其他水果名后都是1个空格,sum后没有空格;第二行price后有2个空格,其后关于价格的表示多为占7格2位小数且左对齐,但其中pineapple为占10格2位小数且左对齐,注意sum的价格仍然占7格,如第一组样例中的54.60后还有2个空格;第三行weight后有1个空格,其后的数据与第二行一致。每两组数据之间有一个空行,最后一组测试数据之后没有空行。
解题思路:
注意格式
初始代码:
#include
int main(){
int m;
char d;
float g;
while(scanf("%d
",&m) != EOF){
float a_price=0, a_weight=0;
float o_price=0, o_weight=0;
float b_price=0, b_weight=0;
float p_price=0, p_weight=0;
float sum_price=0,sum_weight=0;
while (scanf("%c %f
",&d,&g) != EOF){
if(d =='a'){
a_price += 1.5 * g;
a_weight += g;
}
if(d=='o'){
o_price += 1.4 * g;
o_weight += g;
}
if(d=='b'){
b_price += 1.48 * g;
b_weight += g;
}
if(d=='p'){
p_price += 1.08 * g;
p_weight += g;
}
}
sum_price=a_price+o_price+b_price+p_price;
sum_weight=a_weight+o_weight+b_weight+p_weight;
printf(" apple orange banana pineapple sum
");
printf("price %.2f %.2f %.2f %.2f %.2f
",a_price,o_price,b_price,p_price,sum_price);
printf("weight %.2f %.2f %.2f %.2f %.2f
",a_weight,o_weight,b_weight,p_weight,sum_weight);
}
return 0;
}
二次调整
while (scanf("%c %f ",&d,&g) != EOF)
修改为
for(int i = 0; i < m; i++){
scanf(" %c %f", &d, &g);读取m次输入
scanf(" %c %f", &d, &g);
在
%c前加了一个空格,用于跳过换行符和空白字符
printf语句调整空格
printf(" apple orange banana pineapple sum ");
printf("price %-7.2f%-7.2f%-7.2f%-10.2f%-7.2f ",
a_price, o_price, b_price, p_price, sum_price);
printf("weight %-7.2f%-7.2f%-7.2f%-10.2f%-7.2f ",
a_weight, o_weight, b_weight, p_weight, sum_weight);
一个测试用例四舍五入错误,需要手动调整
// 手动四舍五入到两位小数
a_price = (int)(a_price * 100 + 0.5) / 100.0;
AC代码:
#include
int main(){
int m;
char d;
float g;
int first = 1;
while(scanf("%d", &m) != EOF){
if(!first){
printf("
");
}
first = 0;
float a_price=0, a_weight=0;
float o_price=0, o_weight=0;
float b_price=0, b_weight=0;
float p_price=0, p_weight=0;
for(int i = 0; i < m; i++){
scanf(" %c %f", &d, &g);
if(d == 'a'){
a_price += 1.5 * g;
a_weight += g;
}
if(d == 'o'){
o_price += 1.4 * g;
o_weight += g;
}
if(d == 'b'){
b_price += 1.48 * g;
b_weight += g;
}
if(d == 'p'){
p_price += 1.08 * g;
p_weight += g;
}
}
// 计算总和
float sum_price = a_price + o_price + b_price + p_price;
float sum_weight = a_weight + o_weight + b_weight + p_weight;
a_price = (int)(a_price * 100 + 0.5) / 100.0;
// 输出 - printf会自动四舍五入到两位小数
printf(" apple orange banana pineapple sum
");
printf("price %-7.2f%-7.2f%-7.2f%-10.2f%-7.2f
",
a_price, o_price, b_price, p_price, sum_price);
printf("weight %-7.2f%-7.2f%-7.2f%-10.2f%-7.2f
",
a_weight, o_weight, b_weight, p_weight, sum_weight);
}
return 0;
}
错误反思:
求奇数的乘积
问题描述
给你n个整数,求他们中所有奇数的乘积。
输入说明
输入数据包含两行,第一行为一个数为n,表示第二行将输入n个整数。你可以假设这n个数据中必定至少存在一个奇数。
输出说明
输出一个整数。
解题思路:
把输入的数据存放到一个数组中,然后再找其中的奇数相乘
初始代码:
#include
int main(){
int T;
int n;
int m[100];
int sum=1;
scanf("%d
",&T);
for (int i=1;i<=T;i++){
if(i==1) {
scanf("%d",&n);
m[0]=n;
}else {
scanf(" %d",&n);
m[i-1]=n;
}
}
for(int j=0;j
AC代码:同上
错误反思:
求最晚和最早日期
问题描述
输入N个日期,每个以年、月、日的顺序读入,打印输出最晚的日期、最早的日期。
输入说明
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由多行组成。每组测试数据的第一行输入一个整数N(0 对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的文本终端)输出两行,每行包括3个整数,第一行为最晚日期,第二行为最早日期,整数之间以一个空格分隔,行首与行尾无空格,所有数据前后没有多余的空行,两组数据之间也没有多余的空行。 三个数组元素的对应位置分别存放年月日,然后进行比较 int yearly=y[0],ylast=y[0]; 对两个变量都赋值 int yearly,ylast=y[0]; 仅对ylast赋值输出说明
解题思路:
初始代码:
#include AC代码:同上
错误反思:







