目录
1104:题目描述 输入正整数n(2<=n<=1000),计算并输出n的所有正因子(包括1,不包括自身)之和。
1105:题目描述 输入两个正整数m和n,顺序输出m到n之间的所有友好数对。
1.1
1102:题目描述
2013年起,火车票退票费比例下调:票面乘车站开车时间前48小时以上的按票价5%计退票费。同时,车票退票费的计算方法不再四舍五入到元为单位,而是以5角为单位:尾数小于0.25元的舍去、不小于0.25元且小于0.75元的计为0.5元、不小于0.75元的进为1元。
编写一个函数,计算退票费,假定退票时间距离开车时间在48小时以上。函数原型如下:
double CancelFee(double price);
本题如果是C/C++代码提交,只需要提交CancelFee函数的定义部分,提交其它内容,编译出错。
输入
输入一个实数,表示火车票票面价格。
输出
输出一个实数,表示退票费,结果保留一位小数。
1.2
答案:
double CancelFee(double price)
{
int x;
price=price*0.05;
x=(int)(price*100)%100;
if(x<25)
x=0;
else if(x<75)
x=50;
else
x=100;
return (int)price+x*0.01;
}
完整版:
#include<stdio.h>
double CancelFee(double price);
int main()
{
int x;
scanf("%d",&x);
printf("%.1lf",CancelFee(x));
return 0;
}
double CancelFee(double price)
{
int x;
price=price*0.05;
x=(int)(price*100)%100;
if(x<25)
x=0;
else if(x<75)
x=50;
else
x=100;
return (int)price+x*0.01;
}
2.1
1103:题目描述
平均学分绩点(Grade Point Average,即GPA)是以学分与绩点作为衡量学生学习的量与质的计算单位,以取得一定的学分和平均学分绩点作为毕业和获得学位的标准,实施多样的教育规格和较灵活的教学管理制度。
大学里每一门课程都有一定的学分。只有通过这门课的考试,才能获得相应的学分。课程绩点的计算方法通常是:(百分制成绩-50)/10 取整。成绩100,对应绩点为5,成绩90~99对应绩点为4,......,成绩60~69对应绩点为1,成绩小于60,对应绩点为0。
平均学分绩点的计算方法是:是将学生修过的每一门课程的绩点乘以该门课程的学分,累加后再除以总学分。 平均学分绩点可以作为学生学习能力与质量的综合评价指标之一。请编程计算一个学生的平均学分绩点。
输入
输入n表示有n门课程,然后输入n门课程的学分和成绩,学分和成绩都是整数。
输出
输出平均学分绩点,保留一位小数。
2.2
答案:
#include<stdio.h>
int main()
{
int n,x,y,a=0;
double sum=0;
scanf("%d",&n);
for(n; n>=1; n--)
{
scanf("%d%d",&x,&y);
sum=sum+x*fx(y);
a=a+x;
}
printf("%.1lf",sum/a);
return 0;
}
int fx(int x)
{
if(x>=50)
return (x-50)/10;
else
return 0;
}
3.1
1104:题目描述
输入正整数n(2<=n<=1000),计算并输出n的所有正因子(包括1,不包括自身)之和。
要求程序定义一个FacSum ()函数和一个main()函数,FacSum ()函数计算并返回n的所有正因子之和,其余功能在main()函数中实现。
int FacSum(int n)
{
//计算n的所有正因子(包括1,不包括自身)之和sum,本函数返回sum
}
输入
输入正整数n(2<=n<=1000)。
输出
输出n的所有正因子(不包括自身)之和。
3.2
答案:
#include<stdio.h>
int main()
{
int x;
scanf("%d",&x);
printf("%d",FacSum(x));
return 0;
}
int FacSum(int n)
{
int i,sum=0;
for(i=1; i<=n/2; i++)
{
if(n%i==0)
sum=sum+i;
}
return sum;
}
4.1
1105:题目描述
输入两个正整数m和n,顺序输出m到n之间的所有友好数对。
如果两个整数的所有正因子之和(包括1,不包括自身)等于对方,就称这对数是友好的。例如:1184和1210是友好数对,因为
1184的因子之和为1+2+4+8+16+32+37+74+148+296+592=1210
1210的因子之和为1+2+5+10+11+22+55+110+121+242+605=1184
要求程序中要定义一个facsum ()函数计算并返回n的所有正因子之和。
int facsum (int n)
{
//计算n的所有正因子之和sum,本函数返回sum
}
对于C/C++代码的提交,要求必须通过定义facsum函数来求一个整数n的正因子之和,否则,提交编译错误,本题需要提交完整的程序代码。
输入
输入两个正整数m和n,1<m<=n<=10000。
输出
输出m和n之间的所有友好数对。
在输出每个友好数对时,要求小数在前、大数在后,并去掉重复的数对。例如,220和284是一对友好数,而284和220也是一对友好数,此时只需输出220和284这对友好数。每个友好数对占一行,两数之间用空格隔开。
如果m和n之间没有友好数对,则输出“No answer”。
4.2
答案:
#include<stdio.h>
int main()
{
int m,n,i,a,b=0;
scanf("%d%d",&m,&n);
for(i=m; i<=n; i++)
{
if(i==a)
continue;
if(facsum(facsum(i))==i && facsum(i)!=i)
if(i>facsum(i))
{
printf("%d %d\n",facsum(i),i);
a=i;
b++;
}
else
{
printf("%d %d\n",i,facsum(i));
a=facsum(i);
b++;
}
}
if(b==0)
printf("No answer");
return 0;
}
int facsum(int n)
{
int i,sum=0;
for(i=1; i<=n/2; i++)
{
if(n%i==0)
sum=sum+i;
}
return sum;
}
ps:第一题要点:
求小数点后两位和0.25,0.75比较大小,只要提取出就可以
最后将price转化为int型,舍弃本来的小数部分(强制转化直接舍弃),加上我们新的小数。
第三题答案解析:
正因子就是大于0的因数,判断因数用取余,判断是否可以除尽(余数=0)
为了减少运算,只要循环到数字的一半就可以(除了他本身,因数<=这个数)
第四题思路:
友好数对判定方法:如果两个整数的所有正因子之和(包括1,不包括自身)等于对方,就称这对数是友好的。(题目解释)
例如 a的正因数和为b,如果b的正因数和也为a,那么a和b为有好数对
为了避免重复输出,用continue结束本次循环,循环到友好数对的小的数字时,跳过另一个大的友好数对
例如
a和b是有好数对,且a>b(输出时已经判定大小了)
从m循环到n,先到b判定成功,输出a和b
用continue跳过b
注意:友好数对从小数到大数为一对且只有这一对,不存在交叉现象
ps:之前考虑交叉现象
为了避免新的判定成功的大数字(d)顶掉我们旧的判定的大数字(a)导致a还没起作用就被提前顶掉。
可以采用数组储存所有的大数字(a和d),循环到后面会跳过所有友好数对对应的大数字
改后如下:
#include<stdio.h>
int main()
{
int m,n,i,a,b=0,x[99999],c,j=0,d;
scanf("%d%d",&m,&n);
for(i=m; i<=n; i++)
{
c=j;
d=0;
for(c; c>=0; c--)
if(x[c]==i)
d=1;
if(d==1)
continue;
if(facsum(facsum(i))==i && facsum(i)!=i)
if(i>facsum(i))
{
printf("%d %d\n",facsum(i),i);
x[j]=i;
j++;
b++;
}
else
{
printf("%d %d\n",i,facsum(i));
x[j]=facsum(i);
j++;
b++;
}
}
if(b==0)
printf("No answer");
return 0;
}
int facsum(int n)
{
int i,sum=0;
for(i=1; i<=n/2; i++)
{
if(n%i==0)
sum=sum+i;
}
return sum;
}
思路:
首先加个数组x,控制数组的j,
加个循环判定 i 是否等于所有的数组值(数组储存的为每对 有好数对 的大数字)
continue只能跳出最近的循环,也就是新建的判定循环,无法直接跳出m-n的大循环
转换思路:新增变量,新加判定就可以。