一道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.
排序最快的应该是快排。
祝你生活愉快。
能把原题复制过来不,你语言描述得不清晰
c语言题麻烦按题目要求写下然后告诉我大概过程谢谢
注意:上面的算法假设了月份是从 1 开始编号的,如果月份是从 0 开始编号的,则需要将上面的算法中的 month - 1 改为 month。需要注意的是,上面的算法中的 is_leap_year 函数没有给出,因为实现方法取决于你所使用的语言。在 C++ 中,可以使用以下代码来判断一个年份是否为闰年:bool is_leap_...
C语言大作业 题目是:请设计一个算法完成两个超长正整数的加法。谁会...
显然是高精度了。我记得长整数指的是long型、超过long还有long long、以及__int64 不过显然题目不是这个意思。我想LZ对加法的竖式应该很熟悉、高精度就是用的竖式的原理。我只给你算法、不提供代码、自己写代码才是最好的。首先、输入的时候就不能直接scanf整形了、那就以字符串的形式输入--我想LZ你...
C语言经典题目
1.正确的算法:如果n=3, 过河时间为A+B+C 如果n<=2, 好算, 不费口舌了 如果n>=4, 这个是重点:每次优先考虑把最慢两人送过河 把n人中最快两人记为A,B, 最慢两人记为C,D(过河时间A<B<C<D), n人问题实质上转换为4人过河问题, 参考到4人过河时的优化,记AB过河, A回, CD过河, B...
C语言题目。。输入一个以回车结束的字符串(少于80 个字符),滤去所有的...
输入存储到字符串,然后逐一判断,删除不合法的字符即可。一、算法分析:1、输入字符串。2、逐一判断是否合法,如果不合法,则删除。删除方法可以使用后续字符覆盖当前字符。3、可以从前向后遍历,每一个不合法字符都被后续合法字符覆盖,这样一次循环即可完成所有操作。二、参考代码:include <stdio.h>int ...
高手进,请教一个C语言算法结构的问题
改好了 void alloc(int m){ for(i=0;i<640-job[m].space;i++){ if(job[m].state==0){ for(j=i;j<i+job[m].space;j++){ if(a[j]!='f') break;} if(j==i+job[m].space)\/\/是否有足够的连续空间 { for(j=job[m].first=i;j...
一道关于c语言的题,准确的说是算法思想,表示想不明白,希望有大神...
第一次 第二个给第一个一个气球(下面称第二个给第一个)第三个给第二个 第四个给第三个 结果为 2, 2, 5, 3 第二次 第二个给第一个 第三个给第二个 结果为 3, 2, 4, 3 第三次 第三个给第二个 结果为3, 3, 3, 3
一道C语言棋盘最优路径的题目,求教
j]保存棋盘格子的价值 (i = 0..n-1, j = 0..m-1)设f[i][j][k]记录棋盘(i, j)位置的最大价值和 (i = 0..n-1, j = 0..m-1, k = 0,1,2)k表示这个位置是怎么来的:k = 0: 左→右k = 1: 上→下k = 2: 下→上首先初始化 f[i][j][k] = -inf然后根据题...
C语言阶梯问题,求教各位大佬啊,刚学C语言,希望大佬能用循环语句死算出来...
这个不是C语言的内容,是概率统计,C语言只是实现计算的语言工具。要解决这个问题,需要用到概率统计,建立概率统计的算法结构:首先要选走两步的台阶,剩下的就是一步,两台阶44 \/2 = 22,最多22步,分别是0个两步,一个两级,二个,三个...22个两级,所以是C(22, 0) + C(22,1)+......
急求C语言答案,题目:有三个数a,b,c,要求按大小顺序把它们输出(用传统流 ...
一、实现思路,用伪代码写出解此题的算法:1、if a>b 将a和b对换 (a是a,b中的小者)。2、if a>c 将a和c对换 (a是a,c中的小者,因此a是三者中最小者)。3、if b>c 将b和c对换 (b是b,c中的小者,也是三者中次小者)。二、实现代码如下:三、执行结果如下:3者比较就是两两...
求有关c语言除法的算法
因为a<=b,有0<=a\/b<=1。假设a\/b为d,则有c=d*100,所以0<=c<=100。不断尝试d的值就可以了,当它最接近a\/b的时候c就是 你要的答案 int c=0;double d=0;while(d*b