PAT习题6-6
习题6-4 使用函数输出指定范围内的Fibonacci数
本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。
int fib(int n)
{
int sum=0;
if(n==1||n==2)
sum+=1;
else
sum+=fib(n-2)+fib(n-1);
return sum;
}
void PrintFN(int m,int n)
{
int i=1;
int flag=1;//最后一个数后没有空格
int count=0;//判断是否有 Fibonacci数在区间内
while(fib(i)<m)
{
i++;
}
while(fib(i)<=n)
{
if(flag)
{
printf("%d",fib(i));
flag=0;
}
else
{
printf(" %d",fib(i));
}
count++;
i++;
}
if(count==0)
{
printf("No Fibonacci number\n");
}
}
习题6-6 本题要求实现一个求整数的逆序数的简单函数。
int reverse(int number)
{
int t=0;
while(number!=0)
{
t=t*10+number%10;
number=number/10;
}
return t;
}
习题8-1拆分实数的整数和小数部分
void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart=(int)x;
*fracpart=x-(*intpart);
}
练习8-8 移动字母
本题要求编写函数,将输入字符串的前3个字符移到最后。
void Shift(char s[])
{
int len=strlen(s);
char tp_s[3];
for(int i=0;i<3;i++)
tp_s[i]=s[i]; //先存前三个元素
for(int i=3;i<len;i++)
s[i-3]=s[i]; //再剩余元素前移
for(int i=0;i<3;i++)
s[len-3+i]=tp_s[i]; //前三个元素到正确位置
}
//思路2
void Shift( char s[] ){
int n=strlen(s);
char temp;
for(int i=0;i<=2;i++){
temp=s[0]; //每次记首元素
for(int j=0;j<n-1;j++){
s[j]=s[j+1]; //元素前移
}
s[n-1]=temp; //首元素插入
}
}
习题8-3 数组循环右移
本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a0a1⋯a**n−1)变换为(a**n−m⋯a**n−1a0a1⋯a**n−m−1)(最后m个数循环移至最前面的m个位置)。
void ArrayShift(int a[],int n,int m)
{
while(m--) //循环次数
{
int temp=a[n-1]; //保存最后一位
for(int i=n-2;i>=0;i--)
a[i+1]=a[i];
a[0]=temp;
}
}
习题8-4 报数
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。其中n是初始人数;m是游戏规定的退出位次(保证为小于n的正整数)。函数CountOff将每个人的退出顺序编号存在数组out[]中。因为C语言数组下标是从0开始的,所以第i个位置上的人是第out[i-1]个退出的。
void CountOff( int n, int m, int out[] )
{
int b[n];
for(int i=0; i<n; i++)
b[i]=i+1;
int i=0, j=0, idx=0;
//j是计数器,idx是退出顺序
while(1)
{
if(b[i]!=0) j++;
if(j==m)
{
out[i]=++idx;
b[i]=j=0;
}
i++;
if(i>=n) i=0;
if(idx==n) break; //全部退出后
}
}
void CountOff( int n, int m, int out[] ){
int a[MAX], count = 1,index = 0;
for (int i=0;i<n;i++)
a[i] = i+1;//为每个人编号,下标加1
while(count <= n){//判断全部报数
for(int i = 0;i<n;i++){//一个一个报数排除
if (a[i] != 0) { //还在圈中
index++;//报一次数
if (index == m) {//每报到m次,该人出局
out[i] = count++;
a[i]=0;//将编号设置为0
index = 0;//将计数器归零
}
}
}
}
}
输入样例 11 3
输出样例 4 10 1 7 5 2 11 9 3 6 8
这题输出很多人看不懂,注意输出说的是 out[i] 对应的该人是第几个输出的。
[(93条消息) 浙大版《C语言程序设计(第3版)》题目集 - 习题8-4 报数(20 分)_放羊的牧码的博客-CSDN博客](https://blog.csdn.net/Dream_Weave/article/details/84940199?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight 124 这位大神的写的就比较一目了然,而且精简 125 */ 复制代码 分类: 【PAT】【个人练习】浙大版《C语言程序设计(第3版)》题目集 标签: 练习 , PAT , C 好文要顶 关注我 收藏该文 行行行行行行行 粉丝 - 0 关注 - 1 +加关注 00 « 上一篇: 习题8-3 数组循环右移 (20分) » 下一篇: 习题8-5 使用函数实现字符串部分复制 (20分) posted @ 2020-07-05 16:00 行行行行行行行 阅读(534) 评论(0) 编辑 收藏 举报 刷新评论刷新页面返回顶部)
习题8-5 使用函数实现字符串部分复制
本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。
函数接口定义:
void strmcpy( char *t, int m, char *s );
函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。
void strmcpy(char *t, int m, char *s)
{
int len = 0; //计算字符串t的长度 不包括最后的'\0'
char *p = t;
int i;
while (*p != '\0')
{
len++;
p++;
}
free(*p);
if (m <= len)
{
for (i = 0; t[m - 1 + i] != '\0'; i++)
{
s[i] = t[m - 1 + i];
}
s[i] = '\0';
}
else
{
*s = '\0';
}
}

浙公网安备 33010602011771号