学习日志//叶圣民//2018.07.14.//C语言数据类型练习

Training 1:整数算法训练

1. 题目:通过编程实现,统计1~n有多少个9

提示:n通过参数传入

2. 题目:n个人围成一圈,顺序排号,从第一个开始报数(13报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位.

提示:用数组完成

3. 题目:输入5个数(含负数、小数)将它们按由小到大的顺序排列起来

提示:需要排数的数字通过参数传递进来,

例如:输入:./a.out  -1  2.1  -3  5  7 输出: -3 -1 2.1 5 7

4. 题目:100以内的素数,全部打印出来

5. 题目: 一个数如果恰好等于它的因子之和,这个数被成为”完数”,例如:6=1+2+3.请编程找出1000以内的完数


第一题 统计范围内 9 的个数

#include <stdio.h>
typedef signed int Int;    //宏定义 Int 代表 signed int

Int main()    //主函数
{   
    Int num;    //声明有符号整型变量 num 用来读取键盘输入
    Int count9 = 0;    //声明有符号整型变量 count9 ;记录 9 的个数
    Int temp;    //声明有符号整型变量 temp 代表 i ,不对 i 进行操作防止死循环
    Int i;    //声明有符号整型变量 i ,再for循环中依次对 8~num 的数进行计算(因为小于 8 的数不存在 9 )

    printf("quit:0(范围内9的个数)  请输入数据(int): ");    //格式化输出:quit:0  请输入数据(int):
    scanf("%d",&num);    //读取键盘输入给 num 
    
    while(num != 0)    //如果 键盘输入为 0 退出,否则死循环,实现可选的退出功能;
    {
        for(i = 8;i <= num;i++)    // i 从 8 到 num 每次 加 1 
        {   
            temp = i;    //把 i 的值给 temp

	    while(temp != 0)    //判断 temp 是否等于 0 ,不等于零 死循环
	    {
                if(temp % 10 == 9)    //如果 temp 除以 9 取余为 9 ,那么出现一个 9 
	        {
	            count9++;    //记录 9 个数的变量 count9 加 1
	        }
	        temp = temp / 10;    //否则 temp 除以 10 取整,返回循环
	    }
        }

        printf("0~%d 中有 %d 个 9 .\n",num,count9);    //格式化输出:0~num 中有 count9 个 9 .
        printf("quit:0  请输入数据(int): ");    //格式化输出:quit:0  请输入数据(int):
        scanf("%d",&num);    //读取键盘输入给 num 
    
    }

    printf("已退出!\n");    //格式化输出:已退出!
    return 0;
}


第二题       报数游戏

#include <stdio.h>

typedef signed int Int;//宏定义 Int 代表 signed int(有符号整型)

Int main()    //主函数
{
    Int num[1000];    //声明整型 数组 有1000个元素
    Int i;    //声明有符号整型变量 i 
    Int quit_num;    //声明有符号整型变量 quit_num 记录有机人已经出局
    Int count;    //声明有符号整型变量 count 记录报数
    Int n;    //声明有符号整型 变量 n

    printf("quit:0(报数)  请输入人数(<1000): ");     //格式化输出:quit:0   请输入人数(<1000): 
    scanf("%d",&n);     //读入总人数
    
    while(n != 0)    //判断 n 是否为 0 ,不为 0 循环;实现可选择退出功能;
    {
        for(i = 0;i < n;i++)    //数组num存放原始编号
        {    
	    num[i] = i + 1;    //数组记录报了数的数据
	}    

            quit_num = 0;    //出圈人数

            i = 0;     //报数起点

            count = 0;     //报数时所报的数字

            while(quit_num < n-1)    //直到只剩下1人时 
            {
	        if(num[i] != 0)    //如果数据不为 0 
	        {
	            count++;     //若未出圈则报数
                }
	        if(count == 3)     //报到3
                {
	            num[i] = 0;        //此人出圈
                    quit_num++;       //出圈人数加1
                    count = 0;         //新一轮报数开始
                }
                i++;     //移到下一个位置
                if(i == n)
	        {
	            i = 0;     //若超出范围,重回头上
	        }
            }   //此循环结束时,已有n-1人退出圈子
        
        for(i = 0;i < n;i++)     //找到未出圈的人
        {
            if(num[i] != 0)
	    {
                printf("最后剩下的人是 %d 号 \n",num[i]);     //如未出圈,就输出此人编号
                printf("quit:0   请输入人数(<1000): "); 
                scanf("%d",&n);     //读入总人数
	    }
        }
    }
    printf(" 已退出!\n");    //格式化输出:已退出!
}


第三题      数字大小排序

#include <stdio.h>

typedef signed int Int;    //宏定义 Int 代表 signed int(有符号整型)
typedef float Float;    //宏定义 Float 代表 float (浮点型)

Int main()    //主函数,返回值为int型

{
    Int i;     //声明有符号整型变量 i
    Int j;    //声明有符号整型变量 j
    Float temp;    //声明浮点型变量 temp
    Float max[5];    //声明浮点型数组 max[5],有5个元素

    printf("如-5 -1.2 0 2 2.4(5个数比大小) 请输入: ");    //格式化输出:如-5 -1.2 0 2 2.4  请输入: 

    for(i = 0;i < 5; i++)    //for 循环 i 从 0 到 4
    {
        scanf("%f",&max[i]);    //依次给数组 5 个元素赋值
    }

    printf("\n");    //换行

    for(j = 0;j < 4;j++)    //for 循环 j 从 0 到 4,进行 4 次循环实现 4 次比较
        for(i = 0;i < 4 - j;i++)    //在每一次中进行 4 - j 次比较
	    if(max[i] > max[i + 1])    //相邻的两个数进行比较
	    {
	        temp = max[i];    //把当前数组max[i] 的值给temp 
		max[i] = max[i + 1];    //把max[i + 1] 的值给ma [i]
		max[i + 1] = temp;    //再把 temp 给max[i+ 1]; 这样就实现了max[i]和max[i+1]值的互换
	    }

    for(i = 0;i < 5;i++)    //for 循环 i 从 0 到 4 每次 +1;实现一次对数组 max 赋值
        printf(" %0.2f ",max[i]);    //输出数组元素 保留2位小数


    printf("\n");     //换行

    return 0;    //函数返回0
}


第四题        打印范围内的素数

#include <stdio.h> 

typedef signed int Int;    //宏定义 Int 代表 signed int

Int main()     //主函数
{ 
    Int num;    //声明有符号整型变量 num;读取键盘输入
    Int i;    //声明有符号整型变量 i;
    Int j;    //声明有符号整型变量 j;
    Int count = 0;    //声明有符号整型变量 count;记录质数的个数,且初值为 0

    printf("(筛选范围内质数)请输入(0退出): ");    //格式化输出:请输入(0退出): 
    scanf("%d",&num);    //读取键盘输入

    while(num != 0)    //num 不为 0 循环 实现可选择的退出功能
    {
        printf("2~%d 中所有的素数: \n",num);    //格式化输出:2~%d 中所有的素数: 

	for(i = 2;i <= num;i++)     //取100以内所有的数
        { 
            for(j = 2;j < i;j++)     //穷举法判断是否有因子
	    {
                if(i % j == 0)     //有则非质数
	            break;     //跳出本次循环;如果没跳出循环j就再+1,这样j就>=i
	    }
            if(j >= i)     //当条件为真则为质数
            {
	        printf("%5d",i);    //格式化输出:i
                count++;           //记录质数个数的count + 1
	        if(count == 10)    //如果质数个数到10 换行,且count清零
	        {   
		    count = 0;
		    printf("\n");
	        }
	    }
        }
        printf("\n");    //换行
        printf("请输入(0退出): ");    //格式化输出:请输入(0退出):
        scanf("%d",&num);    //读取键盘输入
    }
    printf("已退出!\n");    //格式化输出:已退出!
    return 0;    //函数返回值 0
}


第五题       输出范围内完数

#include <stdio.h>
typedef signed int Int;    //宏定义Int 代表 signed int

Int perfectNum(Int n)   //定义计算和判断输入值是否是 完数 的子函数
{
    Int i;    //声明有符号整型变量i
    Int temp = 0;    //声明有符号整型变量temp,并且赋值为0

    for(i = 1;i <= n / 2;i++)    //i 从 1 到 n/2 每次 +1,因为如果 i 可以加到 n 那么会有重复记录
    {
	    if(n % i == 0)    //n 除以 i 取余,若为零,说明 i 是 n 的因子
            {    
		temp += i;    //每次的到的因子相加
	    }
    }
        if(temp == n)    //判断计算出来的 因子数之和 是否等于输入的原数
	return 1;    //若是返回 1
	else    //必须要加else否则默认返回1;
	return 0;    //若不是则返回 0
}

Int main()    //主函数
{    
    Int n;    //声明有符号整型变量 n,用于读取键盘输入
    Int i;    //声明有符号整型变量 i,用于循环对子函数输入 1 ~ n 的数

    printf("(0退出)(筛选范围内完数)  请输入max (范围:0~max): \n");    //格式化输出:请输入max (范围:0~max): 
    printf("   ");    //格式化输出三个空格位置

    scanf("%d",&n);    //读取键盘输入

    printf("0~%d 范围内所有完数:\n",n);    //格式化输出:0~n  范围内所有完数:

    while(n != 0)    //判断 n 是否为 0;实现可选择的退出功能
    {
        for(i = 1;i <= n;i++)    //for循环实现依次对 perfectNum子函数赋值
            if( perfectNum(i))    //如果子函数返回值为 1 那么输出 i (i 为完数)
                printf("%d\n",i);
        
	printf("(0退出)  请输入max(范围:0~max): \n");    //格式化输出:请输入max (范围:0~max):
	printf("   ");    //格式化输出三个空格位置
        scanf("%d",&n);    //读取键盘输入
    }
    printf("已退出!\n");    //格式化输出:已退出!
}

猜你喜欢

转载自blog.csdn.net/qq_31421117/article/details/81046069