BUPT2021秋季计算导论第六次实验
最大公约数和最小公倍数
实验3_13_最大公约数和最小公倍数 (100 分)
已知两个正整数m和n,求其最大公约数和最小公倍数。
输入格式:
两个用空格分隔的正整数m和n。
输出格式:
只有一行,为两个用空格分隔的正整数,依次代表m和n的最大公约数和最小公倍数。测试用例保证m、n及其最小公倍数可以用int存储。
输入样例:
12 36
输出样例:
12 36
这是一种简单的代码,老师上课教我们的写法。
#include<stdio.h>
int main()
{
int M,N,m,n;
int t = 0;
scanf("%d %d",&M,&N);
m = M;
n = N;
while(n!=0)
{
t = m%n;
m = n;
n = t;
}
printf("%d %d",m,M/m*N);
return 0;
}
这是一个比较复杂的写法
#include<stdio.h>
int Factor ( int , int );
int Mult ( int , int);
int main()
{
int m ,n ;
scanf("%d %d", &m , &n);
int a,b;
a= Factor ( m , n);
b= Mult ( m ,n );
printf("%d %d\n", a, b);
return 0 ;
}
int Factor ( int m , int n )
{
int p;
if(m > n)
{
p = n;
}
else {
p = m;
}
int j ;
int factor = 1;
for ( j = 1; j <= p ; j++)
{
if((m % j == 0)&&(n %j ==0))
{
if (j >= factor )
{
factor = j;
}
}
}
return factor;
}
int Mult ( int m , int n)
{
int i ;
if (m>n)
{
i = m;
}
else {
i = n;
}
int j ;
int mult = 1;
for ( j = i ;j<= m* n; j++)
{
if(( j % m == 0)&&( j % n ==0))
{
mult = j;
break;
}
}
return mult ;
}
韩信点兵实验
4_1_韩信点兵 (100 分)
韩信有一队兵,他想知道一共有多少人,便让士兵排队报数。站5人一排,多出1人;站6人一排,多出5人站;67人一排,多出6人;站11人一排,多出10人。问韩信至少有多少兵?
输入格式:
为一个整数n(0<n<10000)。
输出格式:
一个不小于n的整数,为韩信可能拥有兵的数量的最小值。
输入样例:
200
输出样例:
461
我采用的是笨方法,从小开始递增,直到找出第一个符合要求的数,也就是最小数,
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int j ;
for ( j = n ; ; j++)
{
if((j-1)%5==0)
{
if((j-5)%6==0)
{
if((j-6)%7 ==0)
{
if((j-10)%11 ==0)
{
printf("%d", j);
break;
}
}
}
}
}
return 0;
}
回文数
实验4_3_回文数 (100 分)
回文是指正读和反读都一样的数或文本段。例如,12321、55555、45554、11611都是回文数。输入一个长度不超过10位的整数n,判断它是否是回文数。
输入格式:
只有一个整数n,即待判断的数字。测试用例保证n可以用int存储。
输出格式:
当n为回文数时输出“Yes”,否则输出“No”。
输入样例:
12321
输出样例:
Yes
#include<stdio.h>
int main()
{
int n ;
scanf("%d", &n);
int i ;
int m = n;
int reverse = 0 ;
int p ;
while ( n != 0)
{
p = n %10 ;
reverse = reverse * 10 + p ;
n = n /10 ;
}
if ( m == reverse )
{
printf("Yes\n");
}
else {
printf("No\n");
}
return 0;
}
进制转换一
输入格式:
为一个只包含0和1的整数n(长度不超过10位),代表二进制数。
输出格式:
为转换得到的十进制数。
输入样例:
11111
输出样例:
在这里给出相应的输出。例如:
31
#include<stdio.h>
int main()
{
int n ;
scanf("%d", &n);
int j ;
int num = 0 ;
int t = 1;
while ( n != 0)
{
j = n % 10 ;
num = num + j * t;
t= t*2;
n = n /10 ;
}
printf("%d\n", num);
return 0;
}
求幂值
输入格式:
只有一个浮点数x,即代表e
x
中的指数x,且x满足x<=20。
输出格式:
只有一个浮点数,即e
x
的值,保留4位小数。
输入样例:
3.7
输出样例:
40.4473
#include<stdio.h>
#include<math.h>
int main()
{
double num ;
scanf("%lf",&num);
double sum = 1.0000;
double j = 1.0000;
double factor = num / j;
double temp ;
while(fabs(factor)>1e-8)
{
sum = sum + factor ;
j ++;
temp = num / j;
factor = factor * temp ;
//printf("%lf ", j);
//printf("%lf ", temp);
}
printf("\n");
printf("%.4lf\n",sum);
printf("%.4lf\n",exp(num));
return 0;
}
圆的切分
实验4_2_圆的切分 (100 分)
在一个平面上有一个圆和n条直线,这些直线中每一条在圆内同其他直线相交,假设没有3条直线相交于一点,试问这些直线将圆分成多少区域。 c.jpg
输入格式:
只有一个整数n(0<=n<100)。
输出格式:
只有一个整数,为圆被n条直线分成的区域的块数。
输入样例:
1
输出样例:
2
#include<stdio.h>
int main()
{
int n,r;
scanf("%d",&n);
r=(n*n+n)/2+1;
printf("%d\n",r);
return 0;
}