7-35 水仙花数 (20 分)
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
结尾无空行
输出样例:
153 370 371 407
结尾无空行
作者 徐镜春 单位 浙江大学
#include<stdio.h>
int mypow(int a,int b);//求a的b次幂,函数的声明
int mypow(int a,int b)//函数的定义
{
int result=1;//局部变量
for(int i=1;i<=b;i++)//几次
{
result=result*a;
}
return result;
}
int main ()
{
int n,t=0;
scanf("%d",&n);
int begin=mypow(10,n-1);//100与1000
int end=mypow(10,n);
for(int i=begin;i<end;i++)//被判断的数
{
//int k=i;
int sum=0;
/*while(k!=0)//k>0
{
t=k%10;//取k的每一位
k=k/10;//更新k值
sum=sum+mypow(t,n);
}*/
for(int k=i;k!=0;)
{
t=k%10;
k=k/10;//更新k值
sum=sum+mypow(t,n);
}
if(sum==i)
printf("%d\n",i);
}
return 0;
}
思路:①设置一个求幂函数求可疑水仙花数的范围,
②两种位数分离的方法(while 循环和for 循环),
③判断是否为水仙花数
R6-2 使用函数输出水仙花数 (10 分)
作者 张高燕 单位 浙大城市学院
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。
函数接口定义:
int narcissistic( int number ); void PrintN( int m, int n );
函数
narcissistic
判断number
是否为水仙花数,是则返回1,否则返回0。函数
PrintN
则打印开区间(m
,n
)内所有的水仙花数,每个数字占一行。题目保证100≤m
≤n
≤10000。裁判测试程序样例:
#include <stdio.h> int narcissistic( int number ); void PrintN( int m, int n ); int main() { int m, n; scanf("%d %d", &m, &n); if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m); PrintN(m, n); if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
153 400
输出样例:
153 is a narcissistic number 370 371
int narcissistic( int number )
{
int s=0,cnt,l,m,t;//设变量l,m
l=m=number;
while(l)//循环下来,number已改变,故求位数时不能用number
{
l=l/10;
cnt++;
}//求位数用位数
while(m!=0)//循环下来,number已改变,故求和时不能用number
{
t=m%10;
s=s+pow(t,cnt);
m=m/10;
}
if(s==number)//if(s==number),由于上面的循环,number已经改变
return 1;
else
return 0;
}
void PrintN( int m, int n )
{
for(int i=m+1;i<n-1;i++)
{
if(narcissistic(i))
printf("%d\n",i);
}
}
7-36 换硬币 (20 分)
作者 C课程组 单位 浙江大学
将一笔零钱换成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 fen5,fen2,fen1,n,count=0;
scanf("%d",&n);//n是零钱数
for(fen5=n;fen5>0;fen5--)
for(fen2=n;fen2>0;fen2--)
for(fen1=n;fen1>0;fen1--)
{
if(fen5*5+fen2*2+fen1*1==n)
{
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",fen5,fen2,fen1,fen5+fen2+fen1);//total是零钱总数,每个fen前要有空格
count++;//count是方法数
}
}
printf("count = %d",count);
return 0;
}
R7-5 人民币兑换 (10 分)
作者 林颖贤 单位 浙江大学
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,cnt=0;
scanf("%d",&n);
for(int fen5=1;fen5<100;fen5++)
for(int fen2=100;fen2>0;fen2--)
for(int fen1=1;fen1<100;fen1++)
{
if(fen5*5+fen2*2+fen1*1==150&&fen5+fen2+fen1==100)//还得确定总枚数为100
{
printf("%d %d %d\n",fen5,fen2,fen1);
cnt++;
if(n==cnt)//重点
return 0;
}
}
return 0;
}
7-37 打印九九口诀表 (15 分)
作者 徐镜春 单位 浙江大学
下面是一个完整的下三角九九口诀表:
1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
本题要求对任意给定的一位正整数
N
,输出从1*1
到N*N
的部分口诀表。输入格式:
输入在一行中给出一个正整数
N
(1≤N
≤9)。输出格式:
输出下三角
N*N
部分口诀表,其中等号右边数字占4位、左对齐。输入样例:
4
结尾无空行
输出样例:
1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16
结尾无空行
#include<stdio.h>
int main ()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
printf("%d*%d=%-4d",j,i,i*j);//%4d默认对齐方式是右对齐
}
printf("\n");//换行
}
return 0;
}//1*1= 12*1= 22*2= 43*1= 33*2= 63*3= 9 %4d本来是右对齐
///题目是左对齐%-4d1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9
7-34 字母塔 (10 分)
作者 李祥 单位 湖北经济学院
请编写程序,显示字母塔。
输入格式
高度(不超过 26 的正整数)
输出格式
显示指定高度的字母塔
输入样例
5
结尾无空行
输出样例
A ABA ABCBA ABCDCBA ABCDEDCBA
结尾无空行
#include<stdio.h>//字母塔看做空格加上顺序逆序排列的字母组成
int main()
{
int n,i,j;
scanf("%d",&n);
char ch;
for(i=1;i<=n;i++)//最外层循环,控制我想要的行数
{//下面几层循环并列,
for(j=n;j>i;j--)//控制空格输出
{
printf(" ");
}
for(ch='A';ch<'A'+i;ch++)//控制顺序输出的字母
{
printf("%c",ch);
}
ch=ch-2;//ch-=2;将我们顺序输出的字母先后退一个再开始循环,因为上个循环中'ch++'这个式子会多加一个值,所以减2
for(ch;ch>='A';ch--)//控制输出逆序的字母
{
printf("%c",ch);
}
printf("\n");
}
return 0;
}
注意:引用https://blog.csdn.net/weixin_45970945/article/details/107525235内容
7-41 统计素数并求和 (20 分)
作者 张彤彧 单位 浙江大学
本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:
输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:
10 31
结尾无空行
输出样例:
7 143
结尾无空行
//素数一般指质数.质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
#include<stdio.h>
int main ()
{
int a,b,flag,count=0,sum=0;
scanf("%d %d",&a,&b);
for(int i=a;i<=b;i++)
{
flag=1;
if(i==1)flag=0;
else
for(int j=2;j<i;j++)//因数j从2开始
{
if(i%j==0)
{
flag=0;
break;
}
}
if(flag==1)
{
count++;
sum=sum+i;
}
}
printf("%d %d",count,sum);
return 0;
}
素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。