水仙花数、嵌套循环、字母塔、素数

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则打印开区间(mn)内所有的水仙花数,每个数字占一行。题目保证100≤mn≤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*1N*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是素数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值