题目:编写程序,计算两个有理数的和。
输入:在一行中按照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;
}