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;
}