4.x习题

4.0求符合给定条件的整数集

 

 

算法:1、初始化,输入a。n1。

a做三位数的第一位。

n1做三位数的第二位,范围为a-a+4。如果跟a重叠则跳过,否则赋值给n1。

n2做三位数的第三位,范围为a-a+4。但如果跟a n1重叠则跳过这个数,否则输出(a n1 n2)。

回到n1步骤,若n1>a+4跳出循环。

回到a步骤,a++

判断a是否在+4的范围内,如果在范围内则回到xxx;不在则跳出循环。 

#include <stdio.h>
int main()
{
    int a,n1,n2;
    scanf("%d",&a);
    n1=a;n2=a;
    while (a<=a+3)
    {
        while (n1<=a+3)
        {
            if (n1==a)
            {
                break;
            }
            while (n2<=a+3)
            {
                if (n2==a||n2==n1)
                {
                    break;
                }
                printf("%d%d%d  ",a,n1,n2);
            }
            n1++;
        }
        a++;
        printf("\n");
    }
    return 0;
}

结果重复3。a在不断变化a++,所以永远都不能满足a<=a+3。

#include <stdio.h>
int main()
{
    int a,i,j,k,cnt;
    scanf("%d",&a);
    i=a;
    while (i<=a+3)
    {
        j=a;
        while (j<=a+3)
        {
            k=a;
            while(k<=a+3)
            {
                if (i!=j)
                {
                    if(i!=k)
                    {
                        if (j!=k)
                        {
                            cnt++;
                            printf("%d%d%d",i,j,k);
                            if (cnt==6)
                            {
                                printf("\n");
                                cnt=0;
                            }else
                            {
                                printf(" ");
                            }
                            
                        }
                        
                    }
                }
                k++;
            }
            j++;
        }
        i++;
    }
    return 0;
}

保留初值,ijk分别代表三位数,cnt代表开头每个数字一行的计数,数字到了回车下一行。

 


 

4.1 水仙花数——不能理解

 

 

 

 

 

 

 

 

 

 

 

 

#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    n=3;
    int first=1;
    int i=1;
    while (i<n)
    {
        first *=10;
        i++;
    }
    // printf("first=%d\n",first);
    //遍历100-999
    i=first;
    while (i<first*10)
    {
        int t=i;
        int sum=0;
        do{
            int d=t%10;
            t/=10;
            int p=d;
            int j=1;
            while (j<n)
            {
                p*=d;
                j++;
            }
            sum+=p;
        }while (t>0);
        if (sum==i)
        {
            printf("%d\n",i);
        }
        i++;
    }
    return 0;
}

 


 

4.2打印九九乘法表

 

 

 算法:1、初始化一个n=1代表行数。初始化一个i代表列数。

3、从i=1开始,每做n*i时,i++,直至i==n。(一个循环)

4、一行算术结束后,n++,i=1,回车下一行。回到第三步。(两个循环)。

#include <stdio.h>
int main()
{
    int n=1,i;
    while (n<=9)
    {
        i=1;
        while (i<=n)
        {
            printf("%d*%d=%d  ",n,i,n*i);
            i++;
        }
        n++;
        printf("\n");
    }
    return 0;
}

 


 

4.3统计素数并求和

 

 

 素数一般指质数。质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

问题:1、怎么判断素数。数字太大怎么办。

 

 

#include <stdio.h>
int main()
{
    // int n,m,sum=0,i;
    // printf("输入1-500的数:");
    // scanf("%d %d"&n,&m);
    // i=n;//保留初始值
    // //判定素数,判定为是的情况下输出该质数,并让sum加上该数。
    // while (i<=m)
    // {
        
    // }

    double x,y,i;
    int a,b;
    x=3.0;//double?
    do
    {
        i=2.0;//从2开始除,判定
        do
        {
            y=x/i;
            a=(int)y;//y是double,没有(int)会变成double类型
            if (y!=a)//判断是否可以整除
            {
                if (i==x-1)//如果i是x-1还没有可以整除的数字就说明是质数了,输出该质数
                {
                    b=(int)x;
                    printf("%d\n",b);
                }
                
            }
            i++;//不能整除就i++,继续除除看
        } while (y!=a);//可以整除跳出这个数字,继续下一个数字。
        x++;
    } while (x<=10000);//3-10000质数
    return 0;
}
#include <stdio.h>
int main()
{
    int a,b,sum=0;
    double n,m,x,y,i;
    printf("输入1-500范围:");
    scanf("%d-%d",&n,&m);
    x=n;
    do
    {
        i=2.0;
        do
        {
            y=x/i;
            a=(int)y;
            if (y!=a)
            {
                if (i==x-1)
                {
                    b=(int)x;
                    printf("%d\n",b);
                    sum +=b;
                }
            }
            i++;
        } while (y!=a);
        x++;
    } while (x<=m);
    printf("\n 质数总和%d",sum);
    return 0;
}

一直在运行,没有出结果。

#include <stdio.h>
int main()
{
    int m,n,i,cnt=0,sum=0;
    scanf("%d %d",&m,&n);
    if (m==1)
    {
        m=2;
    }
    for ( i = m; i < n; i++)
    {
        int isp=1;
        int k;
        for ( k = 2; k < i-1; k++)
        {
            if (i%k==0)
            {
                isp=0;
                break;
            }
        }
        if (isp)
        {
            cnt++;
            sum+=i;
        }
    }
    printf("%d %d\n",cnt,sum);
    return 0;
}

 


 

4.4猜数字游戏

 

 

随机: 

int a = rand() % 51 + 13;    //产生13~63的随机数

http://c.biancheng.net/view/2043.html

#include <stdio.h>
// #include <stdlib.h>
// #include <time.h>
int main(){
    int a;
    // srand((unsigned)time(NULL));
    a = rand() % 51 + 13;
    printf("%d\n",a);
    return 0;
}
//可使用

算法:

1、生成一个随机数x,一个用户猜数字的变量a,猜的次数n。

2、do-while,第一次猜也是一次。输入a,与x比较大小,n++,若大则输出"big",小则输出"small",相等就是猜到了,显示“猜对了”并显示猜的次数n。如果n<1,提示bingo;n<3,提示lucky;n<=10,提示good guess;n>10,游戏结束game over。游戏结束之前,输入负数也会输出game over。

#include <stdio.h>
int main()
{
    int x,a,n=0;
    x=rand()%100+0;
    printf("%d",x);
    printf("猜数字:");
    do
    {
        scanf("%d",&a);
        n++;
        if (a==x)
        {
            if (n=10)
            {
                printf("game over\n");
            }else if (n==1)
            {
                printf("bingo\n");
            }else if (n<=3&&n>1)
            {
                printf("lucky\n");
            }else if (n<=10&&n>3)
            {
                printf("good\n");
            }else 
            break;
        }else if(a<0)
        {
            printf("game over\n");
            break;
        }else if (a<x)
        {
            printf("小了,再猜:");
        }else if (a>x)
        {
            printf("大了,再猜:");
        }   
    } while (n<=9);
    return 0;
}

问题:随机数不随机只有一个数字,还需要研究原理。第10次后还是会判定大小才结束。

#include <stdio.h>
int main()
{
    int m=0,n=0;
    //int m=rand()%100+1;//随机的数
    // int n=rand()%100+1;//猜的最大次数
    int count=0;//次数
    // int a=0;
    int guess=0;//猜的数字
    int over=0;//游戏开始结束标识
    scanf("%d %d",&m,&n);
    while (count<n&&over==0)//保持循环的条件是输入次数小于n并且有游戏继续的标识,两者不满足其一就会
    {
        over=0;//游戏进行
        scanf("%d",&guess);//猜数字
        //一起判定不容易出现先后问题
        if (guess<0)
        {
            printf("game over\n");
            over=1;
        }else if (guess==m&&count==0)
        {
            printf("bingo\n");
            over=1;
        }else if (guess==m&&count<3)
        {
            printf("lucky\n");
            over=1;
        }else if (guess==m)
        {
            printf("good\n");
            over=1;
        }else if (guess>m)
        {
            printf("big\n");
        }else if (guess<m)
        {
            printf("small\n");
        }
        count++;
    }
    if (over==0)//应该没有循环出来over==0,大于N就会出现这种情况
    {
        printf("game over\n");
    }
    return 0;
}

 

posted @ 2022-04-11 09:26  石绿  阅读(48)  评论(0)    收藏  举报