1.密码破译
要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母。
例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译为"Glmre"。
请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。
测试输入:China
测试输出:Glmre
#include <stdio.h>
int main(){
char s[11];
gets(s); //输入字符串
for (int i = 0; s[i] != '\0'; i++){
if (s[i] >= 'A' && s[i] <= 'Z'){ //判断是否为大写字母
s[i] = (s[i] + 4 - 'A') % 26 + 'A'; //大写字母后移
}
if (s[i] >= 'a' && s[i] <= 'z'){ //判断是否为小写字母
s[i] = (s[i] + 4 - 'a') % 26 + 'a'; //小写字母后移
}
}
puts(s); //输出字符串
return 0;
}
2.最大公约数与最小公倍数
输入两个正整数m和n,求其最大公约数和最小公倍数。
测试输入:12,8
测试输出:4,24
#include <stdio.h>
int main(){
int n, m, r, p;
scanf("%d,%d", &n, &m);
if(n < m){ //确保 n 比 m 大
int temp = n;
n = m;
m = temp;
}
p = n * m;
while(m != 0){
r = n%m;
n = m;
m = r;
}
printf("最大公约数为: %d\n", n);
printf("最小公倍数为: %d\n", p/n);
return 0;
}
3.字符统计
输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。
测试输入:aklsjflj123 sadf918u324 asdf91u32oasdf/.';123
测试输出:字母数:23,数字数:16,空格数:2,其他数:4
方法一:利用 getchar()
输入字符。
#include <stdio.h>
int main(){
int letter = 0, number = 0, space = 0, other = 0;
char ch;
while((ch = getchar()) != '\n'){ //读入字符
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
letter ++;
else if (ch == ' ')
space ++;
else if (ch >= '0' && ch <= '9')
number ++;
else
other ++;
}
printf("字母数:%d,数字数:%d,空格数:%d,其他数:%d", letter, number, space, other);
return 0;
}
方法二:利用 gets()
输入字符串。
#include <stdio.h>
#include <string.h>
char str[200];
int main(){
int letter = 0, number = 0, space = 0, other, n;
gets(str);
n = strlen (str);
for(int i = 0; i < n; i++){
if ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z'))
letter ++;
else if (str[i] == ' ')
space ++;
else if (str[i] >= '0' && str[i] <= '9')
number ++;
else
other++;
}
printf("字母数:%d,数字数:%d,空格数:%d,其他数:%d", letter, number, space, other);
return 0;
}
4.求和1
求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。例如: a为2,n=5时,Sn=2+22+222+2222+22222,a,n由键盘输入。
测试输入:2 5
测试输出:24690
#include <stdio.h>
int main(){
int a, n, sn = 0, temp = 0;
scanf("%d %d", &a, &n);
for(int i = 0; i < n; i++){
temp += a;
sn += temp;
a *= 10;
}
printf("%d\n", sn);
return 0;
}
5.求和2
求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。
#include <stdio.h>
int main(){
int n;
long long Sn = 0, temp = 1;
scanf("%d", &n);
for (int i = 1; i <= n; i++){
temp = temp * i;
Sn = Sn + temp;
}
printf("%lld", Sn);
return 0;
}
6.求和3
求以下三数的和, 1a之和,1b的平方和,1~c的倒数和。a,b,c 由键盘输入,保留2位小数。
测试输入:100 50 10
测试输出:47977.93
#include <stdio.h>
int main(){
int a, b, c;
double sum1 = 0, sum2 = 0 , sum3 = 0;
scanf("%d %d %d", &a, &b, &c);
for (int i = 1; i <= a; i++)
sum1 += i;
for (int i = 1; i <= b; i++)
sum2 += i * i;
for (double i = 1; i <= c; i++)//i作分母,使用double类型
sum3 += 1/i;
printf("%.2lf", sum1 + sum2 + sum3);
return 0;
}
7.水仙花数
打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。 例如:153是一个水仙花数,因为153=13+53+3^3。
测试输入:无
测试输出:无
#include<stdio.h>
int main(){
int a,b,c;
for(int i=100; i<1000; i++){
a = i / 100; //百位
b = i / 10 % 10; //十位
c = i % 10; //个位
if(a*a*a + b*b*b + c*c*c == i)
printf("%d ",i);
}
return 0;
}
8.完数
一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子。
测试输入:1000
测试输出:6 its factors are 1 2 3
28 its factors are 1 2 4 7 14
496 its factors are 1 2 4 8 16 31 62 124 248
#include <stdio.h>
int main(){
int N, sum = 0;
scanf( "%d", &N );
for ( int i = 2; i <= N; i++ ){
for ( int j = 1; j <=i/2; j++ ){
if ( i % j == 0 )
sum = sum + j;
}
if ( sum == i ){
printf( "%d its factors are ", i );
for ( int k = 1; k <=i/2; k++ ){
if ( i % k == 0 )
printf( "%d ", k );
}
printf( "\n" );
}
sum = 0;
}
return 0;
}
9.求和4
有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和,保留两位小数。
测试输入:10
测试输出:16.48
#include<stdio.h>
int main(){
int n;
double sum = 0, a = 2.0, b = 1.0, t;//a为分子,b为分母
scanf("%d", &n);
for(int i = 0; i < n; i++){
sum += a / b;
t = a;
a = a + b;
b = t;
}
printf("%0.2lf", sum);
return 0;
}
10.自由下落的距离计算
一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数。M, N由键盘输入。
测试输入:1000
测试输出:5
#include<stdio.h>
int main(){
double M, N;
scanf("%lf %lf", &M, &N);
double sum = M, h = M/2;
for(int i = 1; i < N; i++){
sum += 2*h;
h = h/2;
}
printf("%lf %lf", h, sum);
return 0;
}
11.猴子吃桃
猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。
测试输入:10
测试输出:1534
# include <stdio.h>
int main()
{
int sum = 1, n;
scanf("%d", &n);
while(n > 1){ //注意循环 n-1 次, 不是n次
sum = (sum + 1) * 2;
n--;
}
printf("%d", sum);
return 0;
}
12.迭代法求平方根
用迭代法求 平方根。
公式:求a的平方根的迭代公式为: X[n+1]=(X[n]+a/X[n])/2 要求前后两次求出的差的绝对值少于0.00001。 输出保留3位小数。
#include <stdio.h>
#include <math.h>
int main(){
double a, x0, x1;
scanf("%lf", &a);
x0 = a/2;
x1 = (x0 + a/x0)/2;
while(fabs(x1-x0) > 1e-5){
x0 = x1;
x1 = (x0 + a/x0)/2;
}
printf("%0.3lf", x1);
return 0;
}
13求N以内的素数
求N以内的素数。
测试输入:10
测试输出:
2
3
5
7
#include <stdio.h>
#include <math.h>
int main(){
int N, isPrime = 1;
scanf("%d", &N);
for(int i = 2; i <= N; i++){//因为 1 不是素数,i 从 2 开始
isPrime = 1;
for(int j = 2; j <= sqrt(i); j++){
if(i % j == 0){
isPrime = 0;
}
}
if(isPrime == 1)
printf("%d\n", i);
}
return 0;
}
14.选择排序
输入10个数,用选择法对10个整数从小到大排序。
测试输入:4 85 3 234 45 345 345 122 30 12
测试输出:3 4 12 30 45 85 122 234 345 345
#include <stdio.h>
void Select_Sort(int a[], int len) {
int min, temp;
for (int i = 0 ; i < len - 1 ; i++){
min = i; // 记录最小值,第一个元素默认最小
for (int j = i + 1; j < len; j++){ // 访问未排序的元素
if (a[j] < a[min]){ // 找到目前最小值
min = j; // 记录最小值
}
}
if(min != i){
temp = a[min]; // 交换两个变量
a[min] = a[i];
a[i] = temp;
}
}
}
int main(){
int a[10];
for(int i = 0; i < 10; i++)
scanf("%d", &a[i]);
Select_Sort(a, 10);
for(int i = 0; i < 10; i++)
printf("%d ", a[i]);
return 0;
}
15.冒泡排序
输入10个数,用选择法对10个整数从小到大排序。
测试输入:4 85 3 234 45 345 345 122 30 12
测试输出:3 4 12 30 45 85 122 234 345 345
#include <stdio.h>
void Bubble_Sort(int a[], int len){
int temp;
for (int i = 0; i < len - 1; i++){
for (int j = 0; j < len - 1 - i; j++){
if (a[j] > a[j + 1]){
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
int main(){
int a[10];
for(int i = 0; i < 10; i++)
scanf("%d", &a[i]);
Bubble_Sort(a, 10);
for(int i = 0; i < 10; i++)
printf("%d ", a[i]);
return 0;
}
16.直接插入排序
输入10个数,用选择法对10个整数从小到大排序。
测试输入:4 85 3 234 45 345 345 122 30 12
测试输出:3 4 12 30 45 85 122 234 345 345
#include <stdio.h>
void Insert_Sort(int a[], int len){
int temp, j;//将 j 定义在for循环外,后面要用到 j
for (int i = 1; i < len; i++){
temp = a[i];
for (j = i; j > 0 && a[j-1] > temp; j--){
a[j] = a[j-1];
}
a[j] = temp;
}
}
int main(){
int a[10];
for(int i = 0; i < 10; i++)
scanf("%d", &a[i]);
Insert_Sort(a, 10);
for(int i = 0; i < 10; i++)
printf("%d ", a[i]);
return 0;
}
17.二分查找(折半查找)
查找 target 在有序数组中的下标。数组长度n,有序数组中的n个元素,target 均由键盘输入。
测试输入1:
4
1 2 3 4
4
测试输出1:4在数组中的下标为3
测试输入2:
4
1 2 3 4
0
测试输出2:数组中不存在0
#include <stdio.h>
int a[100];
int search(int a[], int n, int target){ //a是数组,n是数组a的大小,target是需要查找的值
int left = 0, right = n - 1;
while (left <= right){ //当left <= right时,区间 [left, right]有效
int mid = (right + left) / 2;
if (a[mid] > target){
right = mid - 1; //target在左区间 [left, mid - 1]
}
else if (a[mid] < target){
left = mid + 1; //target在右区间 [mid + 1, right]
}
else{ //既不在左边,也不在右边,那就是找到答案了
return mid; //返回的是 target在数组中的位置
}
}
//循环结束都没有找到目标值,说明数组中没有 target
return -1;
}
int main(){
int n, target, pos;
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
scanf("%d", &target);
pos = search(a, n, target);
if(pos == -1)
printf("数组中不存在%d\n", target);
else
printf("%d在数组中的下标为%d\n", target, pos);
return 0;
}
18.矩阵对角线求和
输入一个3×3矩阵,求主对角线元素之和与副对角线元素之和。
测试输入:
1 2 3
1 1 1
3 2 1测试输出:
主对角线之和为 3
副对角线之和为 7
#include<stdio.h>
int main(){
int a[3][3];
int sum1 = 0, sum2 = 0;
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
scanf("%d", &a[i][j]);
}
}
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
if(i == j) //主对角线
sum1 += a[i][j];
if(i + j == 2) //副对角线
sum2 += a[i][j];
}
}
printf("主对角线之和为 %d\n副对角线之和为 %d\n", sum1, sum2);
return 0;
}
19.数组插入
已有一个已正序排好的9个元素的数组,今输入一个数要求按原来排序的规律将它插入数组中。
测试输入:
1 7 8 17 23 24 59 62 101
50测试输出:
1 7 8 17 23 24 50 59 62 101
#include<stdio.h>
int main(){
int a[10], num;
for(int i = 0; i < 9; i++)
scanf("%d", &a[i]);
scanf("%d", &num);
int j;
for (j = 9; j > 0 && a[j-1] > num; j--){ //直接插入排序的思想
a[j] = a[j-1]; //元素后移
}
a[j] = num;
for(int i = 0; i < 10; i++)
printf("%d ", a[i]);
return 0;
}
20.数字逆序输出
输入n个数字,然后逆序输出。
测试输入:
10
1 2 3 4 5 6 7 8 9 0
测试输出:
0 9 8 7 6 5 4 3 2 1
#include<stdio.h>
int a[100];
int main(){
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
for(int i = n-1; i >= 0; i--)
printf("%d ", a[i]);
return 0;
}
21.二维数组转置
写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。
测试输入:
1 2 3
4 5 6
7 8 9测试输出:
1 4 7
2 5 8
3 6 9
#include<stdio.h>
int a[3][3];
void convert(int a[][3]){//注意二维数组作为形参,列数不能省略
int temp;
for(int i = 0; i < 3; i++){
for(int j = i + 1; j < 3; j++){ //j从i + 1开始, 将矩阵上对角线元素与下对角线元素交换
temp = a[i][j];
a[i][j] = a[j][i];
a[j][i] = temp;
}
}
}
int main(){
for(int i = 0; i < 3; i++){ //输入二维数组
for(int j = 0; j < 3; j++){
scanf("%d", &a[i][j]);
}
}
convert(a);
for(int i = 0; i < 3; i++){ //输出二维数组
for(int j = 0; j < 3; j++){
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
22.字符串反转
写一函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
测试输入:123456abcdef
测试输出:fedcba654321
#include <stdio.h>
#include <string.h>
char str[100];
void inverse(char str[]){
int temp, len = strlen(str); //len为字符串长度
for(int i = 0; i < len/2; i++){
temp = str[i];
str[i] = str[len-i-1];
str[len-i-1] = temp;
}
}
int main(){
gets(str);
inverse(str);
puts(str);
return 0;
}
23.字符串连接
写一函数,将两个字符串连接。
#include <stdio.h>
#include <string.h>
char s1[100], s2[100], s[200];//连接s1,s2,将结果存入s
void concatenate(char s1[], char s2[], char s[]){
int k = 0; //k为s的下标
for(int i = 0; s1[i] != '\0'; i++)
s[k++] = s1[i];
for(int i = 0; s2[i] != '\0'; i++)
s[k++] = s2[i];
s[k] = '\0'; //在结尾加上结束符
}
int main(){
gets(s1);
gets(s2);
concatenate(s1, s2, s);
puts(s);
return 0;
}
24.数字分离
写一函数,输入一个 n 位数字,要求输出这 n 个数字字符,但每两个数字间空格。如输入1990,应输出"1 9 9 0"。
测试输入:1990
测试输出:1 9 9 0
#include <stdio.h>
#include <string.h>
char num[100];
void function(char num[]){
int len = strlen(num);
for(int i = len; i > 0; i--){
num[2*i] = num[i];
num[2*i - 1] = ' ';
}
}
int main(){
gets(num);
function(num);
puts(num);
return 0;
}
25.整数处理
输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数; ①输入10个数;②进行处理;③输出10个数。
测试输入:2 1 3 4 5 6 7 8 10 9
测试输出:1 2 3 4 5 6 7 8 9 10
#include <stdio.h>
int a[10];
void input(int a[]){ //输入函数
for(int i = 0; i < 10; i++)
scanf("%d", &a[i]);
}
void deal(int a[]){ //处理函数
int temp, max = 0, min = 0;//max和min分别记录最大值和最小值的下标
for(int i = 0; i < 10; i++){
if(a[max] < a[i])
max = i;
}
for(int i = 0; i < 10; i++){
if(a[min] > a[i])
min = i;
}
temp = a[0];//将最小的数与第一个数交换
a[0] = a[min];
a[min] = temp;
temp = a[9];//将最大的数与最后的数交换
a[9] = a[max];
a[max] = temp;
}
void output(int a[]){ //输出函数
for(int i = 0; i < 10; i++)
printf("%d ", a[i]);
}
int main(){
input(a);
deal(a);
output(a);
return 0;
}
26.数字后移
有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数。
测试输入:
10
1 2 3 4 5 6 7 8 9 10
2测试输出:9 10 1 2 3 4 5 6 7 8
#include <stdio.h>
int a[100], b[100];
void function(int a[], int n, int k){
int temp;
for(int i = 0; i < n; i++)
b[(i+k)%n] = a[i];
for(int i = 0; i < n; i++)
a[i] = b[i];
}
int main(){
int n, k; //n 个数,后移 k 位
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
scanf("%d", &k);
function(a, n, k);
for(int i = 0; i < n; i++){
printf("%d ", a[i]);
}
return 0;
}
27.字符串拷贝
有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。键盘上输入顺序为:数字n 一行字符串 数字m。
测试输入:
6
abcdef
3测试输出:cdef
#include <stdio.h>
#include <string.h>
char s1[100], s2[100];
void copy(char s1[], char s2[], int n, int m){
int k = 0;
for(int i = m-1; i < n; i++)
s2[k++] = s1[i];
s2[k] = '\0';
}
int main(){
int n, m;
scanf("%d", &n);
getchar(); //吞掉输入n之后的回车,不然回车会赋值给s1
gets(s1);
scanf("%d", &m);
copy(s1, s2, n ,m);
puts(s2);
return 0;
}
28.第几天(使用结构体)
定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。
测试输入:2000 12 19
测试输出:是第354天
#include <stdio.h>
int mon[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//每个月的天数
struct y_m_d{ //定义年月日结构体 y_m_d
int year;
int month;
int day;
}data; //定义一个结构体变量,变量名为data,相当于 y_m_d data
//其中 y_m_d相当于数据类型, data为变量名
int main(){
int day_sum = 0;
scanf("%d %d %d", &data.year, &data.month, &data.day);//输入年月日
if(data.year % 4 == 0) //如果是闰年,2月就要改成29天
mon[1] = 29;
for(int i = 0; i < data.month - 1; i++)//计算第几天
day_sum += mon[i];
day_sum += data.day;
printf("是第%d天", day_sum);
}
29.结构体之成绩统计1
现有有N个学生的数据记录,每个记录包括学号、姓名、三科成绩。 编写一个函数input,用来输入一个学生的数据记录。 编写一个函数print,打印一个学生的数据记录。 在主函数调用这两个函数,读取N条记录输入,再按要求输出。 N<100
测试输入:
2
a100 clang 70 80 90
b200 dotcpp 90 85 75测试输出:
a100,clang,70,80,90,
b200,dotcpp,90,85,75,
#include <stdio.h>
const int N = 100;
struct student{
char num[10]; //学号
char name[10]; //姓名
int score[3]; //三科成绩
}stu[N];
void input(int n){ //输入函数
for(int i = 0; i < n; i++){
scanf("%s", stu[i].num);// gets(stu[i].num)
scanf("%s", stu[i].name);// gets(stu[i].name)
for(int j = 0; j < 3; j++)
scanf("%d", &stu[i].score[j]);
}
}
void print(int n){ //输出函数
for(int i = 0; i < n; i++){
printf("%s,%s,", stu[i].num, stu[i].name);
for(int j = 0; j < 3; j++)
printf("%d,", stu[i].score[j]);
printf("\n");
}
}
int main(){
int n;
scanf("%d", &n);
input(n);
print(n);
return 0;
}
30.结构体之成绩统计2
有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩、平均分)。
测试输入:
1 a 100 100 100
2 b 90 90 100
3 c 90 100 90
4 d 100 90 90
5 c 100 100 98
6 e 99 98 87
7 ee 99 100 89
10 f 89 87 86
8 bw 10 9 8
9 o 100 0 100测试输出:
3门课程的总平均分为 83.30
最高分学生数据为:
学号:a,姓名:a,成绩:100 100 100,平均成绩:100.00
#include <stdio.h>
const int N = 10;
struct student{
char num[10]; //学号
char name[10]; //姓名
int score[3]; //三科成绩
double aver; //平均成绩
}stu[N];
int main(){
//输入学生数据
double sum;
//sum记录每个学生的三科成绩总分,用来求该学生平均分
for(int i = 0; i < N; i++){
scanf("%s", stu[i].num);
scanf("%s", stu[i].name);
sum = 0;
for(int j = 0; j < 3; j++){
scanf("%d", &stu[i].score[j]);
sum += stu[i].score[j];
}
stu[i].aver = sum/3.0;
}
//计算总平均分
double sum_aver = 0, aver = 0;
//sum_aver为所有学生的平均分之和,aver为要输出的总平均分
for(int i = 0; i < N; i++)
sum_aver += stu[i].aver;
aver = sum_aver / N;
printf("3门课程的总平均分为 %.2lf\n", aver);
//输出最高分学生数据
double max = stu[0].aver;
int max_i = 0;
//max记录最高平均分,max_i记录最高分学生下标
for(int i = 0; i < N; i++){
if(stu[i].aver > max){
max = stu[i].aver;
max_i = i;
}
}
printf("最高分学生数据为:\n");
printf("学号:%s,姓名:%s,成绩:%d %d %d,平均成绩:%.2lf",
stu[max_i].name, stu[max_i].name,
stu[max_i].score[0], stu[max_i].score[1], stu[max_i].score[2], stu[max_i].aver);
return 0;
}
31.约瑟夫环(数组版)
n个人围成一圈,从第一个人开始报数,数到 m的人出列,再由下一个人重新从1开始报数,数到 m的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
例如 n=13, m=3 时,13个人围成一圈,从第一个人开始顺序报号1,2,3,凡报到 3 者退出圈子,接着下一个人从1开始重新报数,直到所有人退出圈子。
测试输入:13 3
测试输出:3 6 9 12 2 5 8 11 1 4 7 10 13
#include <stdio.h>
const int N = 100;
int st[N]; //标记是否出圈
int main(){
int n, m;
scanf("%d %d", &n, &m);
int surplus = n; //surplus为圈中剩余人数
int i = 0, count = 1;//count为报数,i为第i个人,i从0开始
while(surplus > 0){
if(st[i] == 1) //跳过
i++;
else{
if(count == m){ //出圈
st[i] == 1;
surplus--;
printf("%d ", i+1);
count = 1; //重新计数
i++;
}
else{
count++;
i++;
}
}
if(i == n) i = 0;
}
return 0;
}
32.约瑟夫环(静态循环链表版)
#include <stdio.h>
const int N = 100;
struct person{
int number;
int next;
}link[N];
int main(){
int n, m;
scanf("%d %d", &n, &m);
//创建循环链表
for(int i = 1; i <= n; i++){
link[i].next = i+1;
link[i].number = i;
}
link[n].next = 1; //最后一个元素的next指针指向第一个元素
int surplus = n; //surplus为圈中剩余人数
int h = 1, count = 1; //count为报数,h为第h个人
while(surplus > 0){
if(link[h].number == 0) //跳过
h = link[h].next;
else{
if(count == m){ //出圈
printf("%d ", link[h].number);
link[h].number = 0; //标记为已出圈
surplus--;
count = 1; //重新计数
h = link[h].next;
}
else{
count++;
h = link[h].next;
}
}
}
return 0;
}
标签:10,语言,int,scanf,编程,++,测试,include From: https://www.cnblogs.com/bwtyt/p/18090333