面向过程程序设计——循环结构程序设计(1)

7-1求平方与倒数序列的部分和

本题要求对两个正整数m和n(m≤n)编写程序,计算序列和m2+1/m+(m+1)2+1/(m+1)+⋯+n2+1/n。

输入格式:

输入在一行中给出两个正整数m和n(m≤n),其间以空格分开。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。

输入样例:

5 10

输出样例:

sum = 355.845635
#include<stdio.h>
int main()
{
    int m=0;
    int n=0;
    double sum=0;
    scanf("%d %d",&m,&n);
        int i=0;
        for(i=m;i<=n;i++)
        {
            sum=sum+i*i+1/(double)i;
        }
    printf("sum = %.6lf",sum);
    return 0;
}

 7-2 输出整数各位数字

本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。

输入格式:

输入在一行中给出一个长整型范围内的非负整数。

输出格式:

从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格。

输入样例:

123456

输出样例:

1 2 3 4 5 6 
#include<stdio.h>
int main()
{
    long a=0;
    scanf("%ld",&a);
    long count =1;
    long b=a;
    while((b/10)!=0)
    {
        b/=10;
        count*=10;
    }
	while(count!=0)
    {		
		printf("%ld ",a/count);
		a%=count;
		count/=10;
    }
    return 0;
}

7-3 求e的近似值

自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。

输入格式:

输入第一行中给出非负整数 n(≤1000)。

输出格式:

在一行中输出部分和的值,保留小数点后八位。

输入样例:

10

输出样例:

2.71828180
#include<stdio.h>
int main()
{  int n,i; double b=1,sum=0;
     scanf("%d",&n);
      for(i=1;i<=n;i++)
        {  b*=i;
          sum+=1.0/b;
  }
 printf("%.8lf",sum+1);
 return 0;
}

 7-4 高空坠球

皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?

输入格式:

输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。

输出格式:

在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。

输入样例:

33 5

输出样例:

94.9 1.0
#include<stdio.h>
#include<math.h>
int main()
{
    int i,h,n;
	float s=0.0,z=0.0,k=2.0;
	scanf("%d %d",&h,&n);
    if(n>0) {
     s=h;
    for(i=1;i<=n;i++){
	s=s+2.0*z;
	z=h/k;
	k=k*2; 
        }
    }
	printf("%0.1f %0.1f",s,z);
	return 0;
}

 7-5 人民币兑换

1元5角钱人民币兑换5分、2分和1分的硬币(每一种都要有)共100枚,会有很多种兑换方案。请编写程序给出各种兑换方案。

输入格式:

输入为一个正整数n,表示要求输出前n种可能的方案。方案的顺序,是按照5分硬币从少到多排列的。

输出格式:

显示前n种方案中5分、2分、1分硬币各多少枚。每行显示一种方案,数字之间空一格,最后一个数字后没有空格。

注意:如果全部方案不到n种,就顺序输出全部可能的方案。

输入样例:

5

输出样例:

1 46 53  
2 42 56  
3 38 59  
4 34 62  
5 30 65
#include<stdio.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    int i,j,k;
	int count=0;
	
	for(i=1;i<100;i++)
	{
		for(j=1;j<100;j++)
		{
			for(k=1;k<100;k++)
			{
				if(i+j+k == 100 && i*5+2*j+k == 150)
				{
					count++;
					if(count<n)
					{
						printf("%d %d %d\n",i,j,k);
					}
					
					if(count == n)
						printf("%d %d %d",i,j,k);
					
				}
			}
		} 
	}

    return 0;
}

7-6 求整数的位数及各位数字之和

对于给定的正整数N,求它的位数及其各位数字之和。

输入格式:

输入在一行中给出一个不超过109的正整数N。

输出格式:

在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。

输入样例:

321

输出样例:

3 6

#include<stdio.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    int count=0;
    int sum=0;
    while(n!=0)
    {
           sum+=n%10;
           count++;
           n/=10; 
    }
    printf("%d %d",count,sum);
    return 0;
}

7-7 打印菱形图案

本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。

输入格式:

输入在一行中给出一个正的奇数n。

输出格式:

输出由n行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。

输入样例:

7

输出样例:

      * 
    * * * 
  * * * * * 
* * * * * * * 
  * * * * * 
    * * * 
      * 
#include<stdio.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    if(n%2!=0)
    {
		for(int i=1;i<=n/2+1;i++)
        {  
			for(int j=1;j<=(n+1)/2-i;j++)
            {
			    printf("  ");
		    }
			for(int m=1;m<=2*i-1;m++)
            {
				printf("* ");
			}
			printf("\n");  
		}
		
		for(int l=1;l<=n/2;l++)
        {    
			for(int z=1;z<=l;z++)
            {
				printf("  ");
			}
			for(int k=1;k<=n-2*l;k++){
				printf("* ");
			}
			printf("\n");
		} 
	}
    return 0;
}

7-8 找完数

所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。

输入格式:

输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。

输出格式:

逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。

输入样例:

2 30

输出样例:

6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
#include <stdio.h>
int main()
{
    int i, m, n;
    scanf("%d %d", &m, &n);
    int count = 0;
    for (i = m; i <= n; i++)
    {
        int sum = 0, a, b;
        for (a = 1; a < i; a++)
        {
            b = i % a;
            if (b == 0)
                sum = sum + a;
        }
        if (sum == i) {
            printf("%d = 1", sum);
            int c, d;
            for (c = 2; c < i; c++)
            {
                d = i % c;
                if (d == 0)
                    printf(" + %d", c);
            }
            printf("\n"); count = count + 1;
        }
    }
    if (count == 0)
        printf("None");
}

7-9 求整数段和

给定两个整数A和B,输出从A到B的所有整数以及这些数的和。

输入格式:

输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。

输出格式:

首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X

输入样例:

-3 8

输出样例:

   -3   -2   -1    0    1
    2    3    4    5    6
    7    8
Sum = 30

#include<stdio.h>
int main()
{
    int a=0;
    int b=0;
    int x=0;
    int Sum=0;
    scanf("%d %d",&a,&b);
    for(int i=a;i<=b;i++)
    {
        printf("%5d",i);
        x++;
        if(x%5==0&&i!=b)
        {
            printf("\n");
        }
        Sum+=i;
        
    }
    printf("\n");
	printf("Sum = %d",Sum);

    return 0;
}

7-10 验证“哥德巴赫猜想”

数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。

输入格式:

输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。

输出格式:

在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。

输入样例:

24

输出样例:

24 = 5 + 19

#include<stdio.h>
#include<math.h>
int sushu(int n)
{
	int i;
	int k;
	int a;
   k=(int)sqrt( (double)n);//强制类型转换
    for(i=2;i<=k;i++)
        if(n%i==0)
            break;
    // 如果完成所有循环,那么m为素数
    // 注意最后一次循环,会执行i++,此时 i=k+1,所以有i>k 
    if(i>k)
        a=1;
    else
        a=0;
    return a;
}
//函数的作用是判断素数
int main()
{
	int n, i;
	scanf( "%d", &n );
	for( i = 2; i <= n / 2; i++ )
	{
		if( sushu( i ) && sushu( n - i ) )//判断两个相加的数是不是同时为素数
		{
			printf( "%d = %d + %d\n", n, i, n - i );
			break;
		}
	}
	
	return 0;
} 
 
 

猜你喜欢

转载自blog.csdn.net/LxinY213/article/details/127818256