【跪求C语言 大神】删数问题。小弟实在走投无路。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【跪求C语言 大神】删数问题。小弟实在走投无路。相关的知识,希望对你有一定的参考价值。

【问题描述】输入一个高精度的大正整数S(S最长可达240位),去掉其中任意N位数字后剩下的数字按原次序组成一个新的正整数S’。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数S’最小。
【输入形式】输入有两行:
1.第一行是大整数S。其中S最长可达240位。
2.第二行是整数N。S、N均以非0数字开头。
【输出形式】输出有一行,是在S中删除N位后所得的最小数字S’。
【样例输入1】
178543
4
【样例输出1】13
【样例输入2】
1002
1
【样例输出2】002
【样例说明】样例1中输入整数S=178543,N=4,要求在178543中删除4位,使剩下的数字最小。正确答案为S’ = 13。样例2中输入整数S=1002,N=1,删完一位后S’ = 002,而不是2,即2之前的0也必须输出。
【运行时限】程序一次运行的最长时间限制在15秒内,超出则认为程序错误。
【算法提示】将整数看作字符串形式读入;删数时,从前往后寻找第一个比后一个数字大的数字,然后删除之,按照这种方法删除N个数字即得最小数字。

我自己编了一段儿,知道不对,求指教。如何把字符串中的数字删除呢?
#include<stdio.h>
#define N 20
main()

int a,b=0,i,c;
char ch[N];
scanf("%s\n",&ch);
scanf("%d",&a);
for(i=0;i<N;i++)

if(ch[i]>ch[i+1])

c=1 ;
if(c=1)
printf("%d",ch[i]);

printf("%s",ch[N-a]);

在DC下写了一个,代码如下:

#include<stdio.h>

#include<stdlib.h>

#define max 240

int main()

    char a[max];

    char b[max];

    char s[max];

    int n,j,i,m,tmp;

    scanf("%s",s);

    for(m=0;s[m]!='\\0';m++);

    //printf("%d\\n",m);//计算它有几位数

    scanf("%d",&n);

    if(m<n) 

   

       printf("要去掉的数字个数大于你所输入的数字位数,请重新输入!!\\n");

       scanf("%d",&n);

     

    for(j=0;j<m;j++)

        a[j]=s[j];

    //printf("\\n");

    for(i=0;i<m-1;i++)

   

       for(j=i+1;j<m;j++)

       

          if(a[i]>a[j])

          tmp=a[i];a[i]=a[j];a[j]=tmp;

       

     

    for(i=0;i<m-n;i++)

       b[i]=a[i];

    for(i=0;i<m;i++)

   

        for(j=0;j<m-n;j++)

       

            if(s[i]==b[j])  putchar(s[i]);

       

   

    printf("\\n");

    system("pause");

    return 0;



结果如图:

参考技术A 字符串是以'\0'结尾的,字符数组应该分配N+1个字节
输入字符不要加上\n,如果你加上,输入字符串时必须要输入\n,scanf函数的地址参数也不对,ch就是一个地址,参数改为ch
循环会出现数组越界,循环内判断语句把等号和赋值运算符搞混了,没有删除字符串元素的操作,printf函数的格式字符也不对
我对算法也有疑问,如果字符串的数字是升序,这个算法不是起不了作用吗?
如果这是你的作业的话,建议你一步一步来,想一次写对还是参考其他同学吧
参考技术B #include<stdio.h>
#include<string.h>
int main()

char A[600];
int i=0,s,k;
scanf("%s",A);
scanf("%d",&s);
while(s>0)

i=0;
while(i<strlen(A)&&A[i]<=A[i+1])
i++;
for(k=i;k<strlen(A);k++)

A[k]=A[k+1];

s--;

printf("%s\n",A);
return 0;

c语言socket通信问题,小弟菜鸟,求大神指导下,谢谢

SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);

if(CreateSocketToServer(sockClient))//已正确创建套接字

if(ConnectToServer(sockClient,flag))//已正确连到服务器

CString sendInfo,recvInfo;
sendInfo="Hello,Sever "+name+" "+passwd+"\n
if(SendInfoToServer(sockClient,sendInfo,flag))//已向服务器发送验证数据

cout<<"向服务器发送用户名和密码:"<<sendInfo<<endl;
recvInfo=RecvInfoFromServer(sockClient,flag);
MessageBox("接收到信息为:"+recvInfo);
if(recvInfo!="false")//得到服务器确认信息

cout<<"客户端接收到服务器响应:"<<recvInfo<<endl;
while(连接服务器成功)

/*我想在得到服务器的确认消息后,新建一个线程与服务端进行通信,但是while的判断
*语句条件是该socket连接仍然存在,但是我百度了下,都说socket不能使用两次connect,
* 那我这里应该怎么判断呢,谢谢各位...
*/




CloseSocketToServer(sockClient);

你可以在while()判断socket句柄是否有效,如果有效,然后,你再创建一个新的线程,线程里重新创建一个socket句柄,重新连接,然后通信。但是我觉得没有必要,你直接while判断句柄有效,然后直接用该句柄进行通信不好么。追问

恩,我明白你的意思了,我还有个问题,就是当程序运行过connect后,继续运行send操作后,这时我断开服务端后,应该是服务断开了呀,应该是接不到什么了,为什么客户端还会接受到一个空消息呢

追答

这是windows socket机制的问题,在windows下是返回一个空消息,在linux下是返回-1 但是在arm下,如果你断开了,但你没有判断就直接recv,那就会提示你段错误了

追问

非常感谢你的热心,还有个问题想问下哈,我将开始创建的socketClient传递到新建的线程中,在线程中新建了一个自己写的socket类的对象,使用该对象的SendInfoToServer(sockClient,sendInfo,flag)与服务器进行通信,想着同一个socketClient,为什么程序会报错socket error 10038即没有建立socket,这是怎么回事呢

追答

你是怎么传进去的,可能是你的传递方式有问题

追问

百度这里字数有限制,我给你发了百度的私信了,呵呵,帮我看下,实在是麻烦你了。。。。

追答

回你了

追问

谢谢你,哈哈,问题解决了,谢谢,学长....,同时谢谢以下各位的回答,真心感谢....

参考技术A 我不明白你为什么要用while。。。用if就可以了啊。。把SOCEKET的套接字传到线程里面,继续用这个套接字做通信接口,完成你的业务逻辑。追问

恩,我刚把它改成if了,,我还有个问题,就是当程序运行过connect后,继续运行send操作后,这时我断开服务端后,应该是服务断开了呀,应该是接不到什么了,为什么客户端还会接受到一个空消息呢

追答

空消息?你是说你发送了密码以后收到一个空消息?还是你发送全部完成以后closesocket以后收到一个空消息?

追问

感谢你哦,呵呵》。。。

参考技术B 把while也挪到新线程中去。

以上是关于【跪求C语言 大神】删数问题。小弟实在走投无路。的主要内容,如果未能解决你的问题,请参考以下文章

跪求C语言大神解决这些C语言选择题

跪求C语言大神解决这些C语言选择题

c语言socket通信问题,小弟菜鸟,求大神指导下,谢谢

求java大神帮我看看 小弟跪求 QAQ

大神快来帮小弟解决一道c语言题: 输入格式: 输入数据的第一行是一个数据T,表示有T组测试数据。

用C语言数据结构编写 删除顺序表中值为x的元素 跪求大神解答 ! !