C语言_0215练习_x位的数/水仙花/数字占n位/素数判断/循环输出与变量的特殊性/pow的代替

04-0. 求符合给定条件的整数集

给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。

输入格式:

输入在一行中给出A。

输出格式:

输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。

输入样例:

2

输出样例:

234 235 243 245 253 254

324 325 342 345 352 354

423 425 432 435 452 453

523 524 532 534 542 543

#include <stdio.h>
    int main(){
        int num;
        int i,j,k,ge,shi,bai;//i百  j十  k个 
        int cnt=0;
        int ret=0;
        scanf("%d",&num);
        //每次从4个数中筛选出最小的数,选3次,不能和已选的相等 
        for(i=num;i<num+4;i++)
        {
            bai=i;
            for(j=num;j<num+4;j++){
                if(j!=i){
                    shi=j;
                }
                else{ continue;//如果不加这个的话 j=i的情况shi没有被赋值,会默认为0 
                }
                for(k=num;k<num+4;k++){
                    if(k!=i&&k!=j){
                        ge=k;
                        cnt ++;}
                    else{ continue;
                        }
                        //满足: 每行6个整数且行末无多余空格
                        if (cnt%6==0){
                            printf("%d\n",bai*100+shi*10+ge);
                        }
                        else
                        printf("%d ",bai*100+shi*10+ge);
                        
                    }
                }
            }
            return 0;
        }
                

优化版本:

//04-0. 求符合给定条件的整数集
#include <stdio.h>
 
int main(){
    int n,x,y,z,cnt=0;
    printf("请输入一个不超过6的数:\n");
    scanf("%d",&n);
    for(x = n ; x < n+4 ; x++){
        for(y = n ; y < n+4 ; y++){
            for(z = n ; z < n+4 ; z++){
                if(x != y && x != z && y != z){
                    printf("%d%d%d ",x,y,z);
                    cnt++;
                    if(cnt%6==0){
                        printf("\n");
                    }
                }
            }
        }
    }
    return 0;
} 

04-1. 水仙花数

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

输入格式:

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

输出格式:

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

输入样例:

3

输出样例:

153

370

371

407

  • 解题思路:

  1. 先解决输入x,程序可以输出x位的所有数字。

  1. 在数字表里面依次查找水仙花数。

  • 思维瓶颈:

  1. 先入为主:

对于输出x位数的问题,过分考虑用for遍历,其实确定最大最小时,然后依次遍历即可。

  1. 循环变量值的改变

特别是在嵌套循环的时候,在循环中变量值被改变,很容易出现【变量值被消耗完了还在用】和【变量的终值随每一次循环叠加】的情况。

#include <stdio.h>
#include <math.h>
    int main(){
        int x,i,tem;
        int index=0;
        int min,max;
        int t,tem2;
        scanf("%d",&x);
//先解决输入x,输出X位的所有数字【确定最大 最小 遍历输出】
        min=pow(10,x-1); 
        max=pow(10,x)-1;
        for(i=min;i<=max;i++)//一个表格;取出i的每一位数
        {
            //printf("%d\t",i);
            t=i;//暂存i的值 
            index=0;
            while(t!=0)
            {
                tem=t%10;
                index=index+pow(tem,x);    
                t=t/10;
                //printf("%d %d %d\n",t,tem,index);
            }
            //printf("%d\n",index);index 叠加了!!!
            tem2=index; 
            if(tem2==i)
            {
                printf("%d\n",i);    
            }
            else {
                continue;
            }
        }
        return 0;
    }

pow函数的代替:

#include <stdio.h>
    int main(){
        int ret=1;
        int i=0;
        int zhishu=2,dishu=3;
        while(i<zhishu){//执行 0<3 1、2 执行两次  
            ret*=dishu;//ret=1*3  ret=3*3 
            i++;
        }
        printf("%d",ret);
    return 0;
    }

04-2. 打印九九口诀表

下面是一个完整的下三角九九口诀表:

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

本题要求对任意给定的1位正整数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 x,y;
        int n,cnt=0;
        scanf("%d",&n);
        for(x=1;x<=n;x++){
            for(y=1;y<=n;y++){
                printf("%d*%d=%d\t",y,x,x*y);
                if(y==x){
                    printf("\n");
                    break;
                }
                }
            }
            
        }

优化版本:

//04-2. 打印九九口诀表
#include <stdio.h>
 
int main(){
    int n, i, j;
    printf("Please input a number from 1 to 9:\n");
    scanf("%d",&n);
    for(i = 1; i <= n; i++){
        for(j = 1; j <= i; j++){
            printf("%d*%d=%-4d",j,i,i*j);
        }
        printf("\n");
    }
    return 0;
}

等号右边数字占4位

//2*4=8(跟三个空格) //4*9=36(跟两个空格)

printf("%d*%d=%-4d",j,i,i*j);

04-3. 统计素数并求和

本题要求统计给定整数M和N区间内素数的个数并对它们求和。

输入格式:

输入在一行中给出2个正整数M和N(1<=M<=N<=500)。

输出格式:

在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。

输入样例:

10 31

输出样例:

7 143

在for循环里面放printf 小心会输出很多次!!

#include <stdio.h>
    int main(){
        int m,n;
        int i,j,t;
        int sum=0,cnt=0; 
        int sig=0;//sig=1为素数 
        scanf("%d %d",&m,&n);
        for(i=m;i<=n;i++)
        {
            //printf("%d",i);10-31的所有数字 
            for(j=2;j<i;j++)
            {
                t=i%j;
                if(t==0){
                    sig=0; 
                    break; //不是素数 换一个i 
                }
                else{
                    sig=1;
                }
            }
            if(sig==1){
                //printf("%d\n",i);//输出了所有的素数
                sum=sum+i;
                cnt ++; 
            }
        }
        printf("共有%d个素数,总和为:%d\n",cnt,sum); 
    return 0;    
    }

04-4. 猜数字游戏

猜数字游戏是令系统随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。

#include <stdlib.h>
#include <time.h>
    int main(){
       int a,ges,cnt=0;
       int n;
       printf("最多猜多少次\n");
       scanf("%d",&n);
       srand(time(0));
       a=rand();//随机产生一个数
       a=a%100;//得到一百以内的数
       printf("%d\n",a);
       do{
               scanf("%d",&ges);
               if(ges<a)
               printf("Too small\n");
               else if(ges>a)
               printf("Too big\n");
               cnt ++;
               if(cnt==n){
                   printf("Game Over");
                   break;
           }
       }while(ges!=a);
       
       if(ges==a)
       {
               if(cnt==1){
               printf("Bingo!\n");
           }
           else if(cnt<=3){
               printf("Lucky You!\n");
           }
           else{
               printf("Good Guess!\n");
           }
       }
     return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值