成绩转换
问题描述
输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
输入说明
输入一个整数。
输出说明
输出对应结果,占一行。如果输入数据不在0~100范围内,请输出一行:“Score is error!”。
注意:无多余空格。
解题思路:
分支语句
初始代码:
#include <stdio.h>
int main(){
int a;
scanf("%d",&a);
if (90<=a && a<=100){
printf("A");
}else if (80<=a && a<=89){
printf("B");
}else if (70<=a && a<=79){
printf("C");
}else if (60<=a && a<=69){
printf("D");
}else if (0<=a &&a<=59){
printf("E");
}else printf("Score is error!");
return 0;
}
AC代码:同上
错误反思:
求第几天
问题描述
按年、月、日的顺序读入一个日期,输出该日期是这一年中的第几天。
输入说明
输入数据为三个正整数y 、m、d,分别表示年、月、日,整数之间以空格分隔,在行首和行尾没有多余的空格。
输出说明
输出一个整数,表示输入的日期是这一年中的第几天,在行首和行尾没有多余的空格。
解题思路:
循环语句,算之前满月的总天数,再加当月天数
初始代码:
#include <stdio.h>
int main(){
int a , b , c;
int he=0;
scanf("%d %d %d", &a ,&b ,&c);
for(int i=0;i<b;i++){
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) he= he+31;
else if(i==4||i==6||i==9||i==11) he=he+30;
else if(i==2){
if (a % 400==0 || (a % 4==0 && a % 100 != 0)) he=he+29;
else he=he+28;}
else he=he;;
}
int result=he+c;
printf("%d\\n",result);
return 0;
}
AC代码:同上
错误反思:
求阶乘结果0的个数
问题描述
编写一个程序,求出N!的末尾含有多少个0。
提示:在乘积中,末尾有多少个0,主要看各乘数的素数因子中有多少个2和5,每一个2和5的结合将给末尾贡献一个0。而乘数中因子2的个数远多于因子5的个数,因此,就计算各乘数中因子5的个数即可。
输入说明
你的数据需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由一行组成,每行由一个正整数N组成,N小于等于100000,在行首和行尾没有多余的空格。
输出说明
对每组测试数据,你的程序需要向标准输出文件(通常为启动该程序的文本终端)依次输出一组对应的答案。所有数据前后不要输出多余的空行,两组数据之间也不要输出多余的空行。每组输出数据由一行组成,每行由一个整数组成,在行首和行尾不要输出多余的空格。
解题思路:
根据提示,提示:在乘积中,末尾有多少个0,主要看各乘数的素数因子中有多少个2和5,每一个2和5的结合将给末尾贡献一个0。而乘数中因子2的个数远多于因子5的个数,因此,就计算各乘数中因子5的个数即可。所以只需要看n中有多少个5,25,125……
初始代码:
#include <stdio.h>
int main(){
int n;
while (scanf("%d",&n) !=EOF){
int count=0;
while (n>=5){
count += n/5;
n = n/5;
}
printf("%d\\n",count);
}
return 0;
}
错误反思:
循环读取多组输入:while (scanf("%d",&n) !=EOF)
如何计算含5的因子
while循环内自定义的变量是局部变量,想要输出,printf语句需在循环内部
怪数
问题描述
寻找怪数:有一种奇怪的自然数,它的比其本身小的所有因子之和等于它本身,例如:6=1+2+3,其中1、2、3都是6的因子,编程找出整数N之内的所有怪数。
输入说明
输入一个整数N(10<=N≤10000),在行首和行尾没有多余的空格。
输出说明
输出N之内(<=N)的所有怪数,每一行输出一个整数。(注:若N中有3个怪数,你则需要输出三行,每行一个怪数。)所有数据前后没有多余的空格,中间也没有多余的空行。
解题思路:
输入一个整数,求它所有小于本身的因数,再相加,看是否等于本身
初始代码:
//0/1
#include <stdio.h>
int main(){
int N;
scanf("%d",&N);
for(int i=2;i<=N;i++){
int sum=0;
for(int j=1;j<i;j++){
if(i%j==0){
sum=sum+j;
}
if (sum==i){
printf("%d\\n",i);
}
}
}
return 0;
}
二次调整
将 if (sum==i){
printf("%d\\n",i);调整至第一个循环中
AC代码:
#include <stdio.h>
int main(){
int N;
scanf("%d",&N);
for(int i=1;i<=N;i++){
int sum=0;
for(int j=1;j<i;j++){
if(i%j==0){
sum=sum+j;
}
}
if (sum==i){
printf("%d\\n",i);
}
}
return 0;
}
错误反思:
求一个数n的因数:循环n % j++ = 0
printf方内循环中意味着每次累加后都判断,放外循环中才是仅判断最后的sum是否等于n
abc数字
问题描述
明明的爸爸是一位著名的数学家同时也是一位著名的数学启蒙老师。他经常出一些简单而有趣的数学题目来给刚刚接触数学的小朋友做,培养他们对数学的兴趣。一天,明明的爸爸想到了这样一个题目。如果有a、b、c三个1位的正整数,那么按以下的方法构成2个三位数:第一种方法是a为百位,b为十位,c为个位,构成的数就是abc;第二种方法是c为百位,b为十位,a为个位,构成的数就是cba;然后将这两个三位数相乘,会得到另一个数。现在就要数一下这个相乘后所得到的数中,有几个数字是与a、b、c相同的。例如:a=1,b=2,c=3,这样构成的两个三位数分别是123和321,两数相乘得到39483,在这个数中有2个“3”与c所表示的“3”是一样的,因此有2个数字是与a、b、c其中之一相同的。明明的爸爸决定明天把这道题目给小朋友做,他手头有很多组这样的a、b、c,但是要把所有的a、b、c都通过上述的方法计算出结果来需要很多的时间,明明的爸爸没有那么多的时间,于是他求助于你,请你帮他写一个程序,用来计算出相应的结果。 明明爸爸的问题可以归结为:输入a,b,c三个一位数字,要求abc这样的一个三位数与cba这样的一个三位数相乘,输出其结果,再判断相乘后的结果中的数字中有多少位是与a、b、c相同的,并输出有几位相等。
输入说明
你写的程序要求从标准输入设备(通常,键盘为标准输入设备)中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行有三个正整数a、b、c,且a、b、c都为正整数,a、b、c中间用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备(通常,显示屏为标准输出设备)中。每组运算结果为两个整数,即abc和cba的乘积和有几位相等,两个数之间用一个空格隔开。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。
解题思路:
算出abc * cba的值result,再循环对10取余和除,对比每次的余数是否和a或b或c相等,count计数相等则加1,输出result和count
初始代码:
//0.85/1
#include <stdio.h>
int main(){
int a, b, c;
while(scanf("%d %d %d",&a,&b,&c)!=EOF){
int sum1=a*100+b*10+c;
int sum2=c*100+b*10+a;
int sum3=sum1*sum2;
int result = sum3;
int count=0;
while (sum3 > 0){
int num = sum3%10;
sum3 = sum3/10;
if( num==a || num==b || num==c){
count++;
}
}
printf("%d %d",result,count);
}
}
二次调整
输入输出+ \\n 分隔
AC代码:
#include <stdio.h>
int main(){
int a, b, c;
while(scanf("%d %d %d\\n",&a,&b,&c)!=EOF){
int sum1=a*100+b*10+c;
int sum2=c*100+b*10+a;
int sum3=sum1*sum2;
int result = sum3;
int count=0;
while (sum3 > 0){
int num = sum3%10;
sum3 = sum3/10;
if( num==a || num==b || num==c){
count++;
}
}
printf("%d %d\\n",result,count);
}
}
错误反思:
1.sum计算误写
2.如何求多位数的每一位是什么
3.当循环读取多组输入,每组的输出必须在大循环内部,且输出大循环局部变量;要求每次输出另起一行需要加换行符





