目录
1.求奇数和。
输入一批正整数(以零或负数为结束标志),求其中的奇数和。试编写相应程序。
输入格式:
输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。
输出格式:
在一行中输出正整数序列中奇数的和。
输入样例:
8 7 4 3 70 5 6 101 -1
输出样例:
116
#include <stdio.h>
int main() {
int n;
int sum=0;
scanf("%d",&n);
while(n>0) {
if( n%2!=0) {
sum=sum+n;
}
scanf("%d",&n);
}
printf("%d",sum);
return 0;
}
2.展开式求和。
输入一个实数x,计算并输出下式的和,直到最后一项的绝对值小于0.000 01,计算结果保留4位小数。要求定义和调用函数fact(n)计算n的阶乘,可以调用pow()函数求幂。试编写相应程序。
输入格式:
输入在一行中给出一个实数x∈[0,5]。
输出格式:
在一行中输出满足条件的幂级数部分和,保留小数点后四位。
输入样例:
1.2
输出样例:
3.3201
#include<stdio.h>
#include<math.h>
double fact(int n);//求阶乘函数
int main() {
double x;
scanf("%lf",&x);
int i=1;
double sum=1,item;
item=pow(x,i)*1.0/fact(i);//最后一项
while(fabs(item)>=0.00001) {
item=pow(x,i)*1.0/fact(i);
i++;
sum=sum+item;
}
printf("%.4lf",sum);
return 0;
}
double fact(int n) {
int i;
double result;
if(n<0) {
return 0;
}
result=1;
for(i=1; i<=n; i++) {
result=result*i;
}
return result;
}
3.求序列和。
输入一个正整数n,输出2/1+3/2+5/3+8/5+... 的前n项之和,保留2位小数。该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。试编写相应程序。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
20
输出样例:
32.66
#include<stdio.h>
int main() {
double n;
scanf("%lf",&n);
int i=1;
double denominator=1.0;//分母
double molecular=2.0;//分子
double a=0.0;
double sum=0;
for(i=1; i<=n; i++) {
sum=sum+molecular/denominator;
a=denominator;
denominator=molecular;
molecular=molecular+a;
}
printf("%.2lf",sum);
return 0;
}
4.求序列和。
输入两个正整数a和n,求a+aa+aaa+aa…a(n个a)之和。例如,输入2和3,输出246(2+22+222)。试编写相应程序。
输入格式:
输入在一行中给出不超过9的正整数a和n。
输出格式:
在一行中按照“s = 对应的和”的格式输出。
输入样例:
2 3
输出样例:
s = 246
#include<stdio.h>
#include<math.h>
int main() {
int a,n;
scanf("%d %d",&a,&n);
int i;
double sum=0,item=0;
for(i=1; i<=n; i++) {
item=a*pow(10,(i-1))+item;
sum=sum+item;
}
printf("s = %.0lf",sum);
return 0;
}
5.换硬币 。
将一笔零钱(大于8分,小于1元,精确到分)换成5分、2分、1分的硬币,每种硬币至少有一枚。输入金额,问有几种换法?针对每一种换法,输出各种面额硬币的数量和硬币的总数量。试编写相应程序。
输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。
输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。
输入样例:
13
输出样例:
fen5:2, fen2:1, fen1:1, total:4 fen5:1, fen2:3, fen1:2, total:6 fen5:1, fen2:2, fen1:4, total:7 fen5:1, fen2:1, fen1:6, total:8 count = 4
#include<stdio.h>
int main()
{
int count=0;
int f5,f2,f1;
int n;
scanf("%d",&n);
int i,j,k;
for (i=n/5;i>=1;i--)
for(j=(n-i*5)/2;j>=1;j--)
for(k=n-i*5-j*2;k>=1;k--)
if(i*5+j*2+k==n)
{
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,i+j+k);
count++;
}
printf("count = %d",count);
return 0;
}
6.输出水仙花数。
输入一个正整数n(3≤n≤7),输出所有的n位水仙花数。水仙花数是指一个n位正整数,它的各位数字的n次幂之和等于它本身。例如153的各位数字的立方和是1³+5³+3³=153。试编写相应程序。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153 370 371 407
#include <stdio.h>
#include <math.h>
int main()
{
int n;
scanf("%d",&n);
if(n==7)
{
printf("1741725\n4210818\n9800817\n9926315");
return 0;
}
int i = 1*pow(10,n-1);
int j = 1*pow(10,n);
//printf("%d\n",j);
for(i=1*pow(10,n-1);i<j;i++)
{
//printf("i=%d,j=%d\n",i,j);
int num = 0;
int m = i;
while(m>0)
{
num = num+pow(m%10,n);
m/=10;
}
//printf("m=%d i=%d,num=%d\n",m,i,num);
if(num==i)
printf("%d\n",i);
}
return 0;
}
7.求最大公约数和最小公倍数。
输入两个正整数m和n(m≤1 000 ,n≤1 000),求其最大公约数和最小公倍数。试编写相应程序。
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
#include <stdio.h>
int main( )
{
int m,n;
scanf("%d %d",&m,&n);
//求最大公倍数 ->辗转相除法
int gcdNum = n;
while(m%n != 0)
{
gcdNum = m%n;
m = n;
n = gcdNum;
}
printf("%d ",gcdNum);
//最小公约数
//->公式: 最小公约数 = m*n/最大公倍数
lcm = m*n/gcdNum;
printf("%d",lcm);
return 0;
}
8.高空坠球。
皮球从height(米)高度自由落下,触地后反弹到原高度的一半,再落下,再反弹……如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?输出保留1位小数。试编写相应程序。
输入格式:
输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。
输出格式:
在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。
输入样例:
33 5
输出样例:
94.9 1.0
# include<stdio.h>
int main() {
int i,h,n;
double sum=0.0,l=0.0,k=2.0;
scanf("%d %d",&h,&n);
if(n>0) {
sum=h;
for(i=1; i<=n; i++) {
sum=sum+2.0*l;
l=h/k;
k=k*2;
}
}
printf("%0.1f %0.1f",sum,l);
return 0;
}
9.打印菱形星号“ * ”图案。
输入一个正整数n(n为奇数),打印一个高度为n的 “ * ” 菱形图案。例如,当n为7时,打印出以下图案。试编写相应程序。
#include <stdio.h>
#include <math.h>
int main() {
int n;
scanf("%d",&n);
int i,j,k;
int h=n/2 ;
for(i=1; i<=h; i++) {//上三角
for(j=1; j<=(h-i)*2+2; j++)
printf(" ");
for(k=1; k<=2*i-1; k++)
printf("* ");
printf("\n");
//printf("*\n");
}
for(i=0; i<=n/2; i++) {//下三角
for(j=i*2; j>=1; j--)
printf(" ");
for(k=1; k<=n-i*2; k++)
printf("* ");
printf("\n");
}
//printf("h=%d",h);
return 0;
}
更详细的输出三角、菱形问题讲解,详见
10.猴子吃桃问题。
一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?试编写相应程序。(提示:采取逆向思维的方法,从后往前推断)
输入格式:
输入在一行中给出正整数N(1<N≤10)。
输出格式:
在一行中输出第一天共摘了多少个桃子。
输入样例:
3
输出样例:
10
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int count = 1;
int i;
for(i=1;i<n;i++)
{
count=(count+1)*2;
}
printf("%d",count);
return 0;
}
11.兔子繁衍问题。
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到n对?输入一个不超过10000的正整数n,输出兔子总数达到n最少需要的月数。试编写相应程序。
输入格式:
输入在一行中给出一个不超过10000的正整数N。
输出格式:
在一行中输出兔子总数达到N最少需要的月数。
输入样例:
30
输出样例:
9
#include<stdio.h>
int main()
{
int n,f=1,time,count=2;
int sum=1;
scanf("%d",&n);
if(n==1) {
printf("%d\n",1);
} else {
while(sum<n) {
count++;
time=f;
f=sum;
sum=sum+time;
}
printf("%d\n",count);
}
return 0;
}