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

7-1 百鸡问题扩展-N鸡问题

N元钱买N只鸡,公鸡每只5元,母鸡每只3元,小鸡1元3只,N元钱必须刚好买N只鸡,而且鸡必须整只买,不能劈开买。

有几种买法呢?这就是N鸡问题。

输入格式:

在一行中输入一个正整数N。(N<500

输出格式:

在一行中输出两个整数c s,中间用一个空格隔开,表示N元钱买N只鸡共有 c 种买法,且所有买法的公鸡数量之和是 s

如果无解,则 s 为 -1.

输入样例1:

100

输出样例1:

4 24

输入样例2:

1

输出样例2:

0 -1

#include<stdio.h>
int main()
{
int N,c=0,s=0;
int gong,mu,xiao;
scanf("%d",&N);
for(gong=0;gong<=N;gong++)
{
	for(mu=0;mu<=N-gong;mu++)
	{		
		for(xiao=0;xiao<=N-gong-mu;xiao++)
		{
			if(gong+mu+xiao==N&&gong*5+mu*3+xiao/3==N&&xiao%3==0)
			{
			c++;
			s+=gong;
			}
		}
	}
}
if(c==0){
printf("0 -1");
}
else
printf("%d %d",c,s);
return 0;
}

7-2 编程打印空心字符菱形

本题目要求读入菱形起始字母和菱形的高度,然后输出空心字符菱形。所谓“空心菱形”是指:每行由两端为字母、中间为空格的字符串构成,每行的字符串中心对齐;上半部分相邻两行字符串长度差2,且字母从给定的起始字母逐一递增;下半部分与上半部分对称。

输入格式:

输入在一行中给出起始字母(范围为英文大写字母A-G)和菱形的高度(为不超过10的奇数)。

输出格式:

输出空心字符菱形。

输入样例:


B 5

输出样例:

  B
 C C
D   D
 C C
  B
#include <stdio.h>
// 1、先画出实心菱形(把菱形分成上下俩部分,再分成正三角和倒三角 ) 
// 2、 把输入的N(n层)带入循环 
// 3、 用if语句使菱形中心为空
// 4、 利用ASCII码的加减  实现字母组成 
int main()
{
	int n,i,j;
	char c;
	scanf("%c%d",&c,&n);
	//针对奇数层的菱形 上部分
	for(i=1;i<=n/2+1;i++)
	{
		//第一个为上班边的倒三角 
		for(j=n/2;j>=i;j--)
			printf(" ");
		//第二个上半边的正三角 
		for(j=0;j<i*2-1;j++)
		{
			//菱形中间的空心用if else来实现 
			if(j==0 || j==i*2-2) 
				printf("%c",c);
			else 
				printf(" ");
		}
		c+=1;
		printf("\n");
	}
	c-=1; 
	//下部分
	for(i=1;i<=n/2;i++)
	{
		c-=1;
		//第三个为下半边的正三角 
		for(j=1;j<=i;j++)
			printf(" ");
		//第四个三角形为倒三角形
		for(j=n-2;j>=i*2-1;j--)
		{
			if(j==n-2 || j==i*2-1) 
				printf("%c",c);
			else 
				printf(" ");
		} 
		printf("\n");
	}
}

7-3 N个数求和

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

2
4/3 2/3

输出样例2:

2

输入样例3:

3
1/3 -1/6 1/8

输出样例3:

7/24

 

#include<stdio.h>
  #include<stdlib.h>
  int gcd(int x,int y)
  {
      return y?gcd(y,x%y):x;
  }
  int main()
  {
      int n,a1,b1,a2,b2,t,p;
     scanf("%d",&n);
     scanf("%d/%d",&a1,&b1);
     n--;
     while(n--)
     {
         scanf("%d/%d",&a2,&b2);
         a1=a1*b2+a2*b1;b1*=b2; //进行通分
         if(a1<0)    //p代表正负
             a1*=-1,p=-1;
         else if(a1==0) //分子为0的情况
         {
             b1=1;continue;
         }
         else p=1;
         t=gcd(a1,b1);
         a1=a1*p/t;b1/=t;
     }
     if(abs(a1)%b1==0) printf("%d\n",a1/b1);  //分类讨论输出
     else if(abs(a1)/b1>=1) printf("%d %d/%d\n",a1/b1,abs(a1)-abs(a1/b1)*b1,b1);
     else printf("%d/%d\n",a1,b1);
 }

 

7-4 水仙花数

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。

输入格式:

输入在一行中给出一个正整数N(3≤N≤7)。

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

3

输出样例:

153
370
371
407

 

#include <stdio.h>
int pow(int a,int b){
    int i,t=a;
    for(i=1;i<b;i++){
        a=a*t;
    }
     return a;
}
int main (){
    int i,n,N;
    int sum,num;
    scanf("%d",&N);
    n=pow(10,N);
    for(i=pow(10,N-1);i<n;i++){
        num=i;
        sum=0;
        while(num>0){
            sum=sum+pow(num%10,N);
            num=num/10;
        }
        if(sum==i){
        printf("%d\n",i);
        }
    }   
    return 0;
}

7-5 小于m的最大的10个素数 

给定一个整数m(50<m<20000),找出小于m的最大的10个素数。

输入格式:

输入在一行中给出一个正整数m(50<m<20000)。

输出格式:

在一行中按递减顺序输出10个满足条件的素数,每个素数输出占6列。没有其它任何附加格式和字符。

输入样例:

229

输出样例:

   227   223   211   199   197   193   191   181   179   173

 

#include<stdio.h>
int judge(int n)
{
	int i;
 	for (i = 2; i < n; i++)
  	if (n%i == 0)break;
 	if (i == n) return 1;
 	else return 0;
}
int main()
{
	int m, i, count = 0;
	scanf("%d", &m);
	for ( i = m-1; i > 1; i--){
	if(judge(i)){
		printf("%6d", i);
   		count++;
  	}
  	if (count == 10)break;
 	}
}

7-6 1000以内所有各位数字之和为n的正整数

输出1000以内所有各位数字之和为n的正整数,例如:如果输入的n是6,那么,105的各位数字之和1+0+5=6, 123的各位数字之和1+2+3=6,两者都满足要求。每行输出6列,每个整数占8位宽度右对齐。

输入格式:

从键盘输入整数n的值。

输出格式:

每行输出6列,每个整数占8位宽度右对齐。如果最后一行不足6列,也需要换行。

输入样例:

在这里给出一组输入。例如:

6

输出样例:

在这里给出相应的输出。例如:

       6      15      24      33      42      51
      60     105     114     123     132     141
     150     204     213     222     231     240
     303     312     321     330     402     411
     420     501     510     600

 

#include<stdio.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    int m=0;
    for(int i=0;i<=1000;i++)
    {
        int ret=0;
        int num=i;
        while(num>0)
        {
            ret+=num%10;
            num/=10;
            
         
        }
        if(ret==n)
        {
           printf("%8d",i);
            m++;
            if(m%6==0)
                
               printf("\n");
        }
    }
   // printf("\n");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值