【跪求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);
恩,我明白你的意思了,我还有个问题,就是当程序运行过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语言 大神】删数问题。小弟实在走投无路。的主要内容,如果未能解决你的问题,请参考以下文章