三道C语言题目,求大神(用指针的方法)。

1.有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数,报数3的人退出圈子,下一个人从1开始重新报数,报数3的人退出圈子。如此循环,直到留下最后一个人。问留下来的人的编号。
【输入形式】

考虑如下两种情况:

如果n超出“n must be a natural number less than 10000”,则打印“n is out of range of valid values.”;其中n应该用如上输入的具体的n数值代替;换行;

如果n是有效范围的数值,则打印“Last No. is:”;然后直接在冒号后面输出最后留下来的人的编号;换行;

【运行时的输入输出样例1】(下划线部分表示输入)

Input n(n must be a natural number less than 10000):5

Last No. is:4

【运行时的输入输出样例2】(下划线部分表示输入)

Input n(n must be a natural number less than 10000):100000

100000 is out of range of valid values.

2.【问题描述】

删除字符串中的字符。输入一个字符串s,再输入一个字符c,将字符串s中出现的所有字符c删除。要求定义并调用函数delchar(s,c),它的功能是将字符串s中出现的所有c字符删除。

【输入形式】

首先打印提示“Input a string:";然后直接在冒号后面输入字符串,字符串中可以包含空格;字符串以回车结束。

打印提示“Input a char:”;然后直接在冒号后面输入一个字符;回车。

【输出形式】

首先打印“After deleted,the string is:”;紧跟后面输出被删除后的字符串剩余内容;换行。

【运行时的输入输出样例】(下划线部分表示输入)

Input a string:happy new year

Input a char:a

After deleted,the string is:hppy new yer

3.【问题描述】

字符串复制。输入一个字符串t和一个正整数m,将字符串t中从第m个字符开始的全部字符复制到字符串s中,再输出字符串s。要求用字符指针定义并调用函数strmcpy(s,t,m),它的功能是将字符串t中从第m个字符开始的全部字符复制到字符串s中。

【输入形式】

首先打印提示“Input a string:";然后直接在冒号后面输入字符串,作为t的内容,字符串中可以包含空格;字符串以回车结束。

打印提示“Input an integer:”;然后直接在冒号后面输入一个正整数,代表m的值;回车。

【输出形式】

首先打印“Output is:”;紧跟后面输出字符串s中的内容;换行。

【运行时的输入输出样例】(下划线部分表示输入)

Input a string:happy new year

Input an integer:7

Output is:new year

(1)

#include "stdio.h"
int main(int argv,char *argc[]){
int n,i,k;
printf("Input n(n must be a natural number less than 10000)): ");
if(scanf("%d",&n)!=1 || n<1 || n>9999){
printf("%d is out of range of valid values.\n",n);
return 0;
}
k=0; 
for(i=1;i<=n;i++)
k=(k+3)%i;
printf("Last No. is: %d\n",k%n+1);
return 0;
}

运行样例:

(2)

#include "stdio.h"
char *delchar(char *s,char c){
int i,j;
for(j=i=0;s[j]=s[i];i++)
if(s[j]!=c)
j++;
return s;
}
int main(int argv,char *argc[]){
char s[300],c;
printf("Input a string: ");
fgets(s,300,stdin);
printf("Input a char: ");
c=getchar();
fflush(stdin);
printf("After deleted,the string is: %s\n",delchar(s,c));
return 0;
}

运行样例:


(3)

#include "stdio.h"
char *strmcpy(char *s,char *t,int m){
char *q=s;
t+=m-1;
while(*q++=*t++);
return s;
}
int main(int argv,char *argc[]){
char t[300],s[300],m;
printf("Input a string: ");
fgets(t,300,stdin);
printf("Input an integer: ");
scanf("%d",&m);
printf("\nOutput is: %s\n",strmcpy(s,t,m));
return 0;
}

运行样例:

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-09-30
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void cl()// 清空缓冲区函数
{
    char ch;
    while((ch=getchar())!='\n'&&ch!=EOF);
}
int main()
{
    int n,i,j,k,num;
    char *p;
    while(1)
    {
        printf("input n(n must be a natural number less than 10000):");
        scanf("%d",&n);
        cl();
        if(n>10000)
        {
            printf("%d is out of range of values\n",n);
            continue;
        }
            p=(char *)malloc(n*sizeof(char));//创建动态数组,每位置0,从下表为0的位开始报数,报道3就把值置一,直到报到1和2的下标相同就退出,解决
            memset(p,0,n*sizeof(char));
            for(num=0,i=0,j=0,k=0;1;i=(i+1)%n)
            {
                if(p[i]==0)
                {
                    num++;//报数
                    if(num==3)//3就置1
                    {
                        p[i]=1;
                        num=0;
                    }
                    else if(num==1)
                    {
                        j=i;//记录1的下标
                    }
                    else if(num==2)
                    {
                        k=i;//记录2的下标
                        if(k==j)
                            break;
                    }
                }
            }
            printf("Last No. Is :%d\n",j+1);
            free(p);
       

    }
    return 0;
}

第一题代码

第2个回答  2012-05-15
问题不难,但写起来很麻烦 十分太少,一个问题十分 俺就给全代码O(∩_∩)O追问

算了,不用了

第3个回答  2012-05-16
刚才没看到题目。。。为什么要用指针?!
指针通常是有结构体 数组 链表什么的时候才用的,这个完全用整型字符型完成的题目为何要用指针?毫无意义!
就算硬要把指针放进去也只能是这种程度:
char a[10];
*(a+5)='c';
而这根a[5]='c';完全没区别
这只是把[]运算符换成了另两个运算符来完成相同运算
能高效快速解决对应问题的程序才是好程序
这种题目不应该用指针,也起不到来练习指针的作用,练习指针最起码要从链表开始
第4个回答  2012-05-25
第一题

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i = 0;
int n = 0;
int out = 0;
int sum = 0;
int str[1024] = {0};

printf("Input n(n<=10000):");
scanf("%d",&n);

for(i = 0;i < n;i++)
{
str[i] = 1;
}

i = 0;
while(out != n-1)
{
if(str[i] == 1)
{
sum++;
}
if(sum == 3)
{

str[i] = 0;
sum = 0;
out++;

if(i == n - 1 )
{
i = 0;
}
}
else
if(i<n-1)i++;
else i=0;
}

for(i = 0;i < n;i++)
{
if(str[i] == 1)
{
printf("Last No. is:%d",i+1);
break;
}
}
return 0;
}

第二题

#include <stdio.h>

void delchar(char *s,char c)
{
char *p;

for(p=s;*s;s++)
if(*s!=c)
*p++=*s;
*p='\0';
}

int main(void)
{
char c,s[100];

printf("Input a string:");
gets(s);
printf("Input a char:");
scanf("%c",&c);
delchar(s,c);
printf("After deleted,the string is:%s\n",s);

return 0;
}

第三题正在写。求给分。本回答被提问者采纳
相似回答