这次是第七章,关于函数以及字符串和数组
7_1 报数退出
【问题描述】m个人围成一圈,1,2,3循环报数,报到3的人退出,并将退出的序号依次存到数组p中,包括最后一个人的序号。输出最后退出的是原来的第几号(最初的序号,以1起始)。若m=6,则最后退出的是1号,退出的顺序是 : 3 6 4 2 5 1;若m=10,则最后退出的是4号,退出顺序是: 3 6 9 2 7 1 8 5 10 4;若m=100,则最后退出的是91号,退出顺序是: 3 6 9……100 58 91。
编写函数int fun(int m ,int p[ ])实现上述功能,返回m个人中最后退出人的序号,并将退出的序号顺序写入p指向的数组中。在主函数中输入人数,调用fun后输出实参数组中保存的退出序号。每行输出10个数据。
本问题限定人数m不超过200人。
【输入形式】输入人数(不大于200的整数)
【输出形式】输出最后退出人的序号,以及退出的顺序
【样例输入1】Input numbe:6
【样例输出1】
Last exit person is 1
Exit order:
3 6 4 2 5 1
【样例输入2】Input numbe:100
【样例输出2】
Last exit person is 91
Exit order:
3 6 9 12 15 18 21 24 27 30
33 36 39 42 45 48 51 54 57 60
63 66 69 72 75 78 81 84 87 90
93 96 99 2 7 11 16 20 25 29
34 38 43 47 52 56 61 65 70 74
79 83 88 92 97 1 8 14 22 28
35 41 49 55 62 68 76 82 89 95
4 13 23 32 44 53 64 73 85 94
5 19 37 50 67 80 98 17 40 59
86 10 46 77 26 71 31 100 58 91
【样例说明】输入样例中下划线上是输入数据;输出时以1个空格分隔数据,每行输出10个数
# include<stdio.h>
int * fun(int m, int *p)
{
int a[m];
int i, po = 0;
for (i = 0; i < m; i++)
a[i] = i+1;
int count = 0;
int num_ans = 0;
while(1)
{
int pp = po % m;
po ++ ;
if(a[pp] == 0)
{
continue;
}
count ++ ;
if (count == 3)
{
count = 0;
p[num_ans] = a[pp];
num_ans ++ ;
a[pp] = 0;
}
if (num_ans == m)
break ;
}
return p;
}
int main()
{
int m, i;
printf("input:");
scanf("%d", &m);
int *pl;
int p[m];
pl = fun(m, p);
printf("Last exit person is %d\n", *(pl+m-1));
printf("Exit order:");
for(i = 0; i < m; i++)
{
if(i%10 == 0)
printf("\n");
printf("%d ", *(pl + i));
}
}
分析
这道题如果想的复杂一些,回想怎样把数组连接成一个环,其实完全可以每次遍历到最后一位置,再从头开始。
每次数到3,就把这个位置置为0,每次遇到0,就跳过
7_2 从数组中删除数据
【问题描述】
定义长度20的int数组,键盘读入20个1位数写入数组。键盘再输入一个要删除的数,从数组中删除此数。
编写函数int delnum(int a[20] , int n , int num),功能是:在数组a的前n个元素中,删除值为num的元素。删除后数组中剩余数据的个数作为函数的返回值返回。注意,要删除的数num在数组中可能不只一个。
从数组中删除一个数,所做的操作是该元素后面的各数据全部前移一个存储位置。
#include<stdio.h>
#define N 20
int delnum(int p[],int n,int num);
int main()
{
int a[N],num,len,i,seed;
printf("Input 20 num:");
for(i=0;i<20;i++) //给数组N个元素赋值
scanf("%d",&a[i]);
puts("========array========");
for(i=0;i<N;i++) //输出数组中所有数据
printf("%d ",a[i]);
puts("");
printf("Please input delete num:");
scanf("%d",&num);
len=delnum(a,N,num); //调用函数,删除数组a中的num,返回剩余数据个数
puts("========array========");
for(i=0;i<len;i++) //输出删除后的数组数据
printf("%d ",a[i]); //注意,这里只输出len个数据
puts("");
return 0;
}
int delnum(int p[],int n,int num)
{
int len = N;
int *p2 = p;
int i, j=0;
for(i = 0; i < n; i++)
{
if(p2[i] == num)
{
p2[i] = -1;
len -- ;
}
}
for(i = 0; i < N; i++)
{
if(p2[i] != -1)
{
p[j] = p2[i];
j ++ ;
}
}
return len;
}
7_3 统计字符串中不同字符的个数
【问题描述】统计字符串str中不同字符的个数输出。
【输入形式】从标准输入中输入一个字符串
【输出形式】将生成的个数输出到标准输出中
【样例输入】One world,One dream!
【样例输出】13
【样例说明】统计包含标点符号和空格,大写和小写视为不同字符。
# include<stdio.h>
# include<string.h>
int main()
{
char str[10000];
char type[10000] ;
int nums = 0;
gets(str);
int len = strlen(str);
int i, j, flag;
for(i = 0; i < len; i++)
{
flag = 0;
for(j = 0; j < nums; j++)
{
if(type[j] == str[i]) // 该类型已记录
{
flag = 1;
break ;
}
}
if(flag == 0)
{
type[nums] = str[i];
nums ++ ;
}
}
printf("%d", nums);
}
分析
对于字符串的 输入,这里采用gets函数,建立一个数组存放每种字符,每遍历一个,就看一下是否已存在
7_4 十进制转二进制
【问题描述】实现十进制整数x到二进制的转换。输入一个十进制整数,将其转换为二进制数并以字符串形式存放于字符数组中并输出。
【输入形式】
从标准输入中输入一个整数
【输出形式】
将转换后的二进制数字符串输出
【样例输入1】
13
【样例输出1】
1101
【样例输入2】
-13
【样例输出2】
-1101
【样例输入3】
0
【样例输出3】
0
【样例说明】
考虑正数、负数和零的情况
# include<stdio.h>
int main()
{
int a ;
int bin[10000] ;
int p = 0 ;
int neg = 0 ;
scanf("%d", &a);
if(a == 0)
{
printf("0");
return 0;
}
if(a < 0)
{
a = -a;
neg = 1;
}
while(1)
{
int b = a % 2 ;
a = a / 2 ;
bin[p++] = b ;
if(a == 0)
break ;
}
int i;
if(neg == 1)
printf("-");
for(i = p-1; i >= 0; i--)
{
printf("%d", bin[i]);
}
return 0;
}
分析
这道题考察了10进制与2进制转化过程:即除二取余,具体可百度。以及数组的输出。