第6关:公约公倍数
题目描述:写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充,变量类型使用long long int
。
输入
两个正整数
输出
最大公约数 最小公倍数 如果输入的数中包含负数,则输出Input Error
#include<stdio.h>
//编写最大公约数GCD函数
/*********Begin*********/
int GCD(int a,int b){
int i,max,min;
max = a>b?a:b;
min = a<b?a:b;
for(i=max;i>0;i--){
if(max%i==0&&min%i==0){
//printf("%d",i);
break;
}
}
return i;
}
/*********End**********/
//编写最小公倍数LCM函数
/*********Begin*********/
long long int LCM(int a,int b){
int i;
long long int max = a>b?a:b;
int min = a<b?a:b;
for(i=1;i<=min;i++){
if((max*i)%min==0){
break;
}
}
//printf("%d\n",i*max);
return i*max;
}
/*********End**********/
int main(void)
{
/*********Begin*********/
int a,b,c;
long long int d;
scanf("%d %d",&a,&b);
if(a<=0||b<=0){
printf("Input Error");
}else{
c=GCD(a,b);
d=LCM(a,b);
printf("%d %lld",c,d);
}
/*********End**********/
return 0;
}
第5关:亲密数
题目描述:两个不同的自然数A
和B
,如果整数A
的全部因子(包括1
,不包括A
本身)之和等于B
;且整数B的全部因子(包括1
,不包括B
本身)之和等于A
,则将整数A
和B
称为亲密数。求3000
以内的全部亲密数。
输入 无需输入
输出 3000
以内的全部亲密数(输出格式:(A
,B
),不加换行,不加分隔符号) 一对亲密数只输出一次,小的在前
样例输出: (220,284)(1184,1210)(2620,2924)
提示:
按照亲密数定义,要判断数a是否有亲密数,只要计算出a的全部因子的累加和为b
,再计算b
的全部因子的累加和为n
,若n
等于a
则可判定a
和b
是亲密数。计算数a
的各因子的算法:
用a依次对i(i=1~a/2)
进行模运算,若模运算结果等于0
,则i
为a
的一个因子;否则i就不是a
的因子。
#include<stdio.h>
void solve(){
/*********Begin*********/
int sum1=0,sum2=0;
for(int i=4;i<3000;i++){
for(int j=1;j<i;j++){
if(i%j==0){
sum1=sum1+j;
}
}
//printf("sum1=%d\n",sum1);
for(int m=1;m<sum1;m++){
if(sum1%m==0){
sum2=sum2+m;
}
}
//printf("sum2=%d\n",sum2);
//break;
if(sum2==i&&i<sum1){
printf("(%d,%d)",i,sum1);
//continue;
}else{
sum1=0;
sum2=0;
}
}
/*********End**********/
}
int main(void)
{
solve();
return 0;
}
第4关:阶乘数列
题目描述:求Sn=1!+2!+3!+4!+5!+…+n!
之值,其中n
是一个数字。
输入
一个整数n(1<=n<=20)
输出
输出表达式的值,占一行。
样例输入:
5
样例输出:
153
提示:
用int
可能会溢出,需要用能表示更大范围的long long
int
(注:VC6.0
不支持此类型,VC
下使用可使用__int64
替代)
#include "stdio.h"
long long int hanshu(int x){
long long int s=0,a=1;
for(int i=1;i<=x;i++){
a=a*i;
s=s+a;
}
return s;
}
int main()
{
int n;
scanf("%d",&n);
printf("%lld",hanshu(n));
return 0;
}
第3关: 编写函数求表达式的值
题目描述:有如下表达式 s = 1 + 1 / 3 + (1 * 2) / (3 * 5) + (1 * 2 * 3) / (3 * 5 * 7) + .... + (1 * 2 * 3 * .... * n) / (3 * 5 * 7 * ... * (2 * n + 1))
。
编写函数求给出的n所对应的表达式s的值。
输入
一个整数n
输出
输出表达式的值,保留小数点后10位的值。
#include "stdio.h"
double hanshu(int x){
double s=1,fenzi=1,fenmu=1;
for(int i=1;i<=x;i++){
fenzi=fenzi*i;
fenmu=fenmu*(2.0*i+1);
s=s+fenzi/fenmu;
}
return s;
}
int main()
{
int n;
scanf("%d",&n);
printf("%.10lf",hanshu(n));
return 0;
}
第2关:回文数计算
本关任务:编写函数求区间[200,3000]
中所有的回文数,回文数是正读和反读都是一样的数。如525
, 1551
输入 无需输入
输出 输出区间[200,3000]
中所有的回文数,一行一个回文数,不需要输出其它无关的字符。
202
212
222
232
242
.....
#include<stdio.h>
void solve(){
/*********Begin*********/
int i,j=0;
int a[100]={0};
int k=0,g,s,bai,q,b,c,d;
for(i=200;i<=3000;i++){
if(i>=200&&i<1000){//求出200到1000之间的所有回文数,都是三位
g=i%10;
s=i/10%10;
bai=i/100;
if(g==bai){
a[k]=i;
k++;
}
}else if(i>=1000&&i<=3000){
q=i%10;
b=i/10%10;
c=i/100%10;
d=i/1000;
if(q==d&&b==c){
a[k]=i;
k++;
}
}
}
//输出a[100]
while(a[j]!=1){
printf("%d\n",a[j]);
j++;
}
/*********End**********/
}
int main(void)
{
solve();
return 0;
}
第1关:求和
任务描述
题目描述:给你一个n
,要求你编写一个函数求1+2+.......+n.
#include<stdio.h>
//编写函数
int sum_x(int i){
int sum=0;
for(int j=1;j<=i;j++){
sum=sum+j;
}
return sum;
}
int main(void)
{
/*********Begin*********/
int x;
scanf("%d",&x);
printf("%d",sum_x(x));
/*********End**********/
return 0;
}