C语言编程练习day22

题目:编写程序,计算两个有理数的和。

输入:在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。

输出:按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

优化目标:无

思路:此题采用较为简单粗暴的纯数学解法。首先求出给出的数字中分母的最小公倍数。此处首先考虑是否本身就是最小公倍数;如若不是,则直接相乘得最小公倍数。再求结果中分子分母的最大公约数与最小公倍数同样想法。首先考虑是否本身是最大公约数;如若不是则求最大公约数,根据数学原理,可知n的最大公约数范围为[2 , n/2],所以在此范围内遍历找到最大公约数。

#include <stdio.h>

int main(){
	int a, b, c, d;
	scanf("%d/%d %d/%d", &a, &b, &c, &d);
	
	int fz, fm, sum;//fz表示分子,fm表示分母
	
	//两个分母相等或成倍数
	if(b == d){
		fz = a + c;
		fm = b;
	}else if(b % d == 0){//分母b是d的倍数
		fz = (b / d) * c + a;
		fm = b;//分母去最大的
	}else if(d % b == 0){//分母d是b的倍数
		fz = (d / b) * a + c;
		fm = d;
	}else {
		fz = a * d + b * c;
		fm = b * d;
	}
	//约简
	if(fz % fm == 0){//分子是分母的倍数
		fz /= fm;
		fm = 1;
	}else if(fm % fz == 0){//分母是分子的倍数
		fm /= fz;
		fz = 1;
	}else{//一般情况
		for(int i=fz/2; i>1; i--){
			if(fz % i ==0 && fm % i ==0){//分子和分母同时能除尽一个i
			    //约分
				fz /= i;
				fm /= i;
				break;
			}
		}
	}
	//打印输出
	if(fm == 1){
		printf("%d", fz);
	}else{
		printf("%d/%d", fz, fm);
	}
	
	return 0;
}

题目:实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。

输入:区间[a, b]

输出:区间[a, b]内所有素数以及他们的和。

优化目标:无

思路:素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。

#include <stdio.h>
#include <math.h>

/*
*判断是否为素数
*p:需要判断的数
*/
int prime( int p ){
	if(p < 0){
		p = -p;//负数取反
	}
	int count = 2;
	for(int i=1; i<=p; i++){
		if(p % i == 0){
			count--;//找到所有p能整除的
		}
	}
	if(count == 0){//当count由2减为0,则说明,刚好被1和自身整除
		return 1;
	}else{//count!=0,则说明,除了被1和自身整除外,还由其他数能整除,所以不为素数
		return 0;
	}
}
/*
*给的区间内所有素数求和
*@m:区间下界
*@n:区间上界
*/
int PrimeSum( int m, int n ){
	int result = 0;
	for(int i=m; i<=n; i++){
		if(prime(i)){//如果i是素数,则返回1
			result += i;
		}
	}
	
	return result;
}
    
int main()
{
    int m, n, p;

    scanf("%d %d", &m, &n);
    printf("Sum of ( ");
    for( p=m; p<=n; p++ ) {
        if( prime(p) != 0 )
            printf("%d ", p);
    }
    printf(") = %d\n", PrimeSum(m, n));

    return 0;
}

题目:给定两个均不超过9的正整数a和n,要求编写函数求a+aa+aaa++⋯+aa⋯a(n个a)之和。

输入:基数a和a的组合最多个数n

输出:a+aa+aaa++⋯+aa⋯a(n个a)之和

优化目标:无

#include <stdio.h>

/*
*返回的是n个a组成的数字.比如n=3,则返回aaa
*@a:基数
*@n:最多a的个数
*/
int fn( int a, int n ){
	int result = 0;
	for(int i=0; i<n; i++){
		result = result*10 +a; 
	}
	return result;
}
/*
*求和.a+aa+aaa++⋯+aa⋯a(n个a)
*@a:基数
*@n:a的最多个数
*/
int SumA( int a, int n ){
	int result = 0;
	for(int i=1; i<=n; i++){
		result += fn(a, i);//返回aaaa...a(i个a)
	}
	return result;
}
    
int main()
{
    int a, n;

    scanf("%d %d", &a, &n);
    printf("fn(%d, %d) = %d\n", a, n, fn(a,n));        
    printf("s = %d\n", SumA(a,n));    
    
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别偷我的猪_09

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值