一道c语言题目 求大神指点下算法?
不知这样可否:调用库函数中的quicksort()分别对N和M这两组数据建行排序;
然后修改折半排序的 判读(具体怎么判定那就看你怎么设计了) 条件,进行选择,时间复杂度为(M*log2 (n))!(n为m 与N中的较大值)不过排序时也要时间哦!但是M和N都可能比较大,我觉得先排序在查找比较好,呵呵....
你应该也是搞ACM的吧?
当然,本人个人觉得本题在某种意义上说,要揣测出题的测试数据才能设计出最好的算法...~~
-----------------------------------
char str[100];
printf("请输入一个字符串:
");
scanf("%s",str);
printf("转换前字符串为:
%s
");
inverse(str);
-----------------------------------
开始的时候,弄一个长度最多为100的char数组,然后把这个数组作为参数给inverse这个function.inverse得到这个参数之后开始运行。
-----------------------------------
for(i=0,j=strlen(str);i<j;i++,j--)
{
t=str[i];
str[i]=str[j-1];
str[j-1]=t;
}
-----------------------------------
for(起始条件;运行条件;每一循环结束后的附加计算)
这个for的起始条件是:i=0 而且 j=参数数组的具体长度(strlen取得数组的具体长度,而不是最大长度)
size_t strlen ( const char * str );
Returns the length of str.
http://www.cplusplus.com/reference/clibrary/cstring/strlen/
这个for的运行条件是:i < j。也就是说,只要i<j,那么就运行for后面大括号的内容。
每一循环结束后的附加计算:i = i + 1; j = j - 1.
如果数组是 abcdefg
那么第一次循环 i = 0, j = 7;
第二次循环 i = 1, j = 6;
第三次 i = 2, j = 5;
...
希望楼主能明白
根据题意,随机生成红绿蓝球任意个数,并任意顺序排列。这里采用随机数实现。
统计按红绿蓝顺序排列最少交换次数,我的思路是:
第一步:循环将最后一个红色球与最靠前的其它两色球(并且满足位置在红球之前)交换。
第二步:循环将最后一个绿球与最靠前的蓝球(必须在绿球之前)交换。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MR 5//每种颜色的球随机生成的最大数量
void showList(int qs[],int len);
int jh(int qs[],int len);//返回交换次数
int main()
{
int i,len,qs[MR*3],n;
int r,g,b;//红绿蓝数量
srand(time(NULL));
r=rand()%MR+1;//1~MR的随机数
g=rand()%MR+1;
b=rand()%MR+1;
len=r+g+b;
printf("随机生成红球%d个,绿球%d个,篮球%d个
",r,g,b);
printf("开始随机排列。。。。。。
");
for(i=0;i<len;i++)
{
n=rand()%3+1;//位置采取抽签,生成1~3的随机数,1表示红,2表示绿,3表示蓝
switch(n)
{
case 1:
if(r>0) qs[i]=n,r--;
else i--;
break;
case 2:
if(g>0) qs[i]=n,g--;
else i--;
break;
case 3:
if(b>0) qs[i]=n,b--;
else i--;
break;
}
}
printf("随机排列后的队列情况为:
");
showList(qs,len);
printf("
");
jh(qs,len);
return 0;
}
int jh(int qs[],int len)//返回交换次数
{
int cnt=0;
int jhbl(int qs[],int len,int lq,int bq);
//最后的红和最前的绿或蓝(且绿球或篮球位置在红球之前)交换
cnt+=jhbl(qs,len,1,0);
//最前的篮球和最后的绿球交换
cnt+=jhbl(qs,len,2,3);
printf("总交换次数至少%d:
",cnt);
return cnt;
}
int jhbl(int qs[],int len,int lq,int bq)//lq:交换中最靠后的球色编号(1~3),bq:交换中最靠前的球色编号(1~3),bq=0:lq与其他两种颜色任意交换
{
int i,j,qSave,cnt=0;
for(i=len-1;i>=0;i--)
{
if(qs[i]==lq)
{
for(j=0;j<len;j++)
if(((bq==0 && qs[j]!=lq)||(bq!=0 && qs[j]==bq)) && j<i)
{
printf("第%d个%s%s%s与第%d个%s%s%s交换,交换后(交换%d次):
",i+1,lq==1?"红球":"",lq==2?"绿球":"",lq==3?"蓝球":"",j+1,qs[j]==1?"红球":"",qs[j]==2?"绿球":"",qs[j]==3?"蓝球":"",cnt+1);
qSave=qs[j],qs[j]=qs[i];qs[i]=qSave,cnt++;
showList(qs,len);
printf("
");
i=len-1;
break;
}
}
}
return cnt;
}
void showList(int qs[],int len)
{
int i;
for(i=0;i<len;i++)
printf("%s%s%s ",qs[i]==1?"红":"",qs[i]==2?"绿":"",qs[i]==3?"蓝":"");
printf("
");
}
你好,
按我的理解,可以将红球看做1,绿球看做2,篮球看做3.
排序最快的应该是快排。
祝你生活愉快。
能把原题复制过来不,你语言描述得不清晰
系昌金裕: 你没考虑到相邻两个数相等你情况.你看样例第四组数开头有两个7,输出是-1,说明严格递增是a[i+1]>=a[i],严格递减是a[i]>=a[i+1].
天山区15157498526: 求大神!!!c语言题目,要方法就可以了,谢谢! - ?
系昌金裕: #include int main() { char str[500]; char *cp; int sum, sum2; while(scanf("%s", str)!=EOF) { cp = str; sum = sum2 = 0; if(*cp=='0' && *(cp+1)=='\0') break; while(*cp != '\0') { sum += *cp-'0'; cp++; } while(sum>9) { sum2 += sum%10; sum /= 10; if(sum { ...
天山区15157498526: 求本道题C语言解法 - ?
系昌金裕: #include int main(){ char strN[50][50]; int Num,i,j,k,flag,Len; scanf("%d%*c", for(i=0;i<Num;i++) scanf("%s%*c",strN[i]); for(i=0;i...
天山区15157498526: 帮忙想想这道C语言题的算法?
系昌金裕: 这就是约瑟夫问题,有一种是要通过输入n,m,k三个正整数(这里m=3,k=1),来求出列的序列.这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素. p->link=head 解决问题的核心步骤: 1.建立一个具有n...
天山区15157498526: 求大神解答该C语言问题的简便算法 - ?
系昌金裕: 这种题,如果没有对子集进行其他约束,比如关系之类的,没有公式可套,只能穷举的,要说简便或快捷算法,只能利用倒推穷举法,就是用m的值和1~n中的子集,从中采用减法剔除筛选出所有子集,并同时给出相应的子集大小,最后给出总数以及符合子集大小要求的子集.代码就不写了.这个实际上就是穷举算法,只是穷举的方式不同而已.
天山区15157498526: 求大神帮忙指点一下C语言编程作业吧~!!1.设计求完全平方数的函数,其功能是:在3位整数(100—999)中寻找既是完全平方数(某个数的平方),又... - ?
系昌金裕:[答案] 1 #include #include int find_complete(int b[]) { int i; int cnt=0; int j=10; for(i=100;i { int single = i%100%10; int ten = i%100/10; int hundred = i/100; if(single == ten || ten == hundred || single == hundred) { for(j=10;j { if(j*j == i) { b[cnt++] = i; } } } } return cnt; } ...
天山区15157498526: 一道c语言编程题,求大神指教! - ?
系昌金裕: #include <stdio.h> void printdigits( int n ); int main() { int n; scanf("%d", &n); printdigits(n); return 0; } void printdigits( int n ) { if(n) { printdigits(n/10); printf("%d\n",n%10); } }
天山区15157498526: 一道C语言编程题(最好把算法也写一下哈~)?
系昌金裕: 来 给 把I J K 都算出来了#include <stdio.h> main() { int i,j=0,k=0; for(i=1;i<=9;i++) {j=2*i;if(j<10&&j!=0){k=3*i;if(k<10&&k!=0&&k!=j){printf("i=%d,j=%d,k=%d\n",i,j,k);}}} }
天山区15157498526: 一道c语言的题 求大神帮忙 - ?
系昌金裕: #include<stdio.h> void main() { char cbegin; //起始字符 int icount,i; //数量 printf("please input a char and a number: "); scanf("%c %d",&cbegin,&icount);//输入 printf("\nresult: "); for(i=0;i<icount;i++)printf("%c",cbegin+i); //输出printf("\n"); }
天山区15157498526: c语言编程题求大神指教,,太笨了,想了一下午都做不出结果s=(2+3)+(2+3+5)+(2+3+5+8) - ?
系昌金裕: 供你参考……#include "stdio.h"void main(void){ int n,i,j,k,s; printf("Type an integer...\nn="); scanf("%d",&n);//表示几项 for(s=0,i=2,j=3,k=5;n;n--){ (s+=s)+=k; k=i+j; i=j; j=k; } printf("The result is %d.\n",s);}