Training 1:整数算法训练
1. 题目:通过编程实现,统计1~n有多少个9
提示:n通过参数传入
2. 题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到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"); //格式化输出:已退出!
}