C语言编程:给定N(2<=N<=100)个不同的正整数,输出其中最大的2个数。 求给出具体的程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言编程:给定N(2<=N<=100)个不同的正整数,输出其中最大的2个数。 求给出具体的程序相关的知识,希望对你有一定的参考价值。

第一行是整数N(N>=10),表明后面有N行数据。
每行数据为一个正整数。

参考技术A   #include <stdio.h>
  int main()
  
   int max,max2;
   int n;
   int tmp;
   while(scanf("%d",&n)!=EOF)
  
   max = max2 = 0;
   for(int i = 0 ;i<n;i++)
  
   scanf("%d",&tmp);
   if(tmp>max)
   max = tmp;
   else if(tmp>max2)
  max2 = tmp;
  
  printf("max = %d,Second max = %d\n",max,max2);
  
   return 0;
  
参考技术B #define N 100
int firMax,secMax,a[N];
fisMax=a[0];
secMax=a[0];
for(int i=0;i<N;i++)

if(firMax>a[i]&&secMax<a[i])secMax=a[i];
else if(firMax<=a[i])secMax=firMax;firMax=a[i]

参考技术C 将n个数存放到数组,然后进行选择排序就出来了。

给定以下语言构造语法 a^n b^m | n,m = 0,1,2,...,n <= 2m [关闭]

【中文标题】给定以下语言构造语法 a^n b^m | n,m = 0,1,2,...,n <= 2m [关闭]【英文标题】:Construct grammar given the following language a^n b^m | n,m = 0,1,2,...,n <= 2m [closed]给定以下语言构造语法 a^n b^m | n,m = 0,1,2,...,n <= 2m [关闭] 【发布时间】:2013-03-11 15:49:20 【问题描述】:

我刚参加了期中考试,但无法回答这个问题。

有人可以举几个语言的例子并为语言构造语法 至少告诉我我会怎么做?

还有L的语法怎么写:

L = an bm | n,m = 0,1,2,..., n

提前致谢。

【问题讨论】:

问问你的助教或者教授不是更好吗? 不,我们这些天都去 *** 上,包括家庭作业解决方案。 它清楚地表明这是一个中期问题。我现在在春假,所以我不能问我的教授。不过还是谢谢。 @user2197126 实际上您的问题非常好,但是您在错误的堆栈溢出表单上提出了one more site,您可以在其中提出理论问题。这种形式更多地与编程相关。虽然,我已经添加了我的答案,希望对您有所帮助 【参考方案1】:

形式语言的语法怎么写?

在阅读我的这个答案之前,您应该先阅读:Tips for creating Context free grammars

an bm 的语法 | n,m = 0,1,2,..., n

你是什么语言 L = an bm | n,m = 0,1,2,..., n

语言描述: 语言 L 由所有字符串组成,其中符号 a 后跟符号 b,其中符号的数量 b 大于或等于 a 数量的 一半

为了更清楚地理解:

在模式 an bm 中,第一个符号 a 出现,然后是符号 @ 987654327@a 的总数为 nb 的总数为 m。不等式表示nm 之间的关系。理解方程式:

given:   n <= 2m   
=>       n/2 <= m       means `m` should be = or > then n/2

=>       numberOf(b) >= numberOf(a)/2    ...eq-1

所以 nm 的不等式说:

numberOf(b) 必须大于或等于一半 numberOf(a)

L 中的一些示例字符串:

b   numberOf(a)=0 and numberOf(b)=1  this satisfy eq-1        
bb  numberOf(a)=0 and numberOf(b)=2  this satisfy eq-1 
    

因此,在语言字符串中,任何数量的 b 都可能没有 a。 (b 的任何字符串) 因为任何数字都大于零 (0/2 = 0)。

其他例子:

                                     m   n
                                 --------------  
ab     numberOf(a)=1 and numberOf(b)=1 > 1/2   
abb    numberOf(a)=1 and numberOf(b)=2 > 1/2  
abbb   numberOf(a)=1 and numberOf(b)=3 > 1/2  
aabb   numberOf(a)=2 and numberOf(b)=2 > 2/2 = 1  
aaabb  numberOf(a)=3 and numberOf(b)=2 > 3/2 = 1.5
aaaabb numberOf(a)=4 and numberOf(b)=2 = 4/2 = 2  

注意事项:

以上所有字符串都是可能的,因为 b 的数量等于 (=) 等于 a 数量的一半 或 更多 (>)。

有趣的一点是,a 的总数也可以多于 b 的数量,但不要太多。而 b 的数量可以比 a 的数量多任意倍。

两个比较重要的案例是:

不可能仅将a 作为字符串。

注意: null ^ 字符串也是允许的,因为在 ^ , numberOf(a) = numberOf(b) = 0 中满足方程。

乍一看,写语法很难,其实不然……

根据语言描述,我们需要以下几种规则:

规则1:生成^空字符串。

 N --> ^  

规则2:生成任意数量的b

 B --> bB | b  

规则 3:生成 a 的: (1) 请记住,如果不生成 b,则不能生成太多 a。 (2) 因为 b 的数量多于 a 的一半;您需要为每个备用 a 生成一个 b (3) 只有a 作为字符串是不可能的,因此对于第一个(奇数)替代方案,您需要添加 ba (4) 而对于替代方案,您可以放弃添加b但不是强制

所以你的整体语法:

   S --> ^ | A | B
   B --> bB | b
   
   A --> aCB | aAB | ^
   C --> aA | ^

这里S 是开始变量。

上面的语法规则你可能对A --&gt; aCB | aAB | ^有混淆,下面是我的解释:

A --> aCB | aAB | ^   
       ^_____^
       for second alternative a 
        
C --> aA    <== to discard `b`    

and  aAB  to keep b

   

让我们使用这个语法规则生成一些语言中的字符串,我正在写最左派生以避免解释。

  ab     S --> A --> aCB --> aB --> ab                        
  abb    S --> A --> aCB --> aB --> abB --> abb
  abbb   S --> A --> aCB --> aB --> abB --> abB --> abbB --> abbb 
  aabb   S --> A --> aAB --> aaABB --> aaBB --> aabB --> aabb
  aaabb  S --> A --> aCB --> aaAB -->  aaaABB --> aaaBB --> aaabB --> aaabb
  aaaabb S --> A --> aCB --> aaAB --> aaaCBB --> aaaaABB --> aaaaBB 
                                                         --> aaaabB 
                                                         --> aaaabb

非会员字符串还有一个:

根据语言 a5 b2 = aaaaabb不可能。因为 2 >= 5/2 = 2.5 ==> 2 >= 2.5 不等式失败。所以我们也不能使用语法生成这个字符串。我尝试在下面显示:

在我们的语法中,要生成额外的a,我们必须使用 C 变量。

S --> A 
  --> aCB 
  --> aaAB 
  --> aa aCB B 
  --> aaa aA BB 
  --> aaaa aCB BB  
           ---              
            ^
           here with first `a` I have to put a `b` too

虽然我的回答已经完成,但我认为您可以更改 A 的规则,例如:

A --> aCB | A | ^

试试看!!

编辑:@us2012 评论:在我看来,S -&gt; ^ | ab | aaSb | Sb 将是一个更简单的描述。我觉得这个问题对 OP 和其他人也有好处。

OP 的语言:

L = an bm | n,m = 0,1,2,..., n

@us2012 的语法:

S -> ^ | ab | aaSb | Sb    

@us2012 的问题:

这个语法是否也生成语言L?

答案是是的!

a 的数量 = nb 的数量 = m 之间的语言不等式是 n =&lt; 2m

我们也可以理解为:

 n =< 2m
 
 that is 
 
 numberOf(a) = <  twice of numberOf(b) 

而在语法中,即使我们添加 onetwo a,我们也会添加 one b 。所以最终 a 的数量不能超过 b 的数量的两倍。

语法也有规则要生成。任意数量的 b 和 null ^ 字符串。

所以@us2012 提供的简化语法是正确的,也准确地生成了语言L。

注意:第一个解决方案来自于我在链接答案中写的推导,我从语言描述开始,然后尝试编写一些基本规则,逐步我可以编写完整的语法。

@us2012 的答案来自 aptitude,您可以通过阅读其他人的解决方案并为某些人编写自己的解决方案来获得编写语法的能力 - 就像您学习编程的方式一样。

【讨论】:

如果您对此有更多疑问/疑问,或者我的回答有误,希望没有 嗯,当我第一次阅读语言定义时,我以为它包括 m = 0,1,2,...,n ,即 m &lt;= n - 但也许我一直读错了。 无论如何,假设你是对的:在我看来,S -&gt; ^ | ab | aaSb | Sb 将是一个更简单的描述 - 我错过了什么吗? @us2012 是的,您的语法是正确的。阅读更新的答案。 非常感谢 Grijesh 的回答 - 令人惊叹的解释!

以上是关于C语言编程:给定N(2<=N<=100)个不同的正整数,输出其中最大的2个数。 求给出具体的程序的主要内容,如果未能解决你的问题,请参考以下文章

c语言for循环求高手讲解一下下面这道题--输出100以内的素数。

c语言 输出[m,n]之间素数 的程序

求c语言题目答案。。。。

C语言 输出n到m之间的所有素数

C语言,求15以内的素数,关于num=1时,怎么修改?求大神

c语言:实现对于给定的正整数N,依次打印出小于等于N的所有素数。两种方法及其优化