码迷,mamicode.com
首页 > 编程语言 > 详细

蓝桥杯2016c语言习题练习(一)

时间:2017-10-18 00:11:36      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:字母   ...   png   main   wap   这一   条件判断   习题   1.0   

技术分享

#include<stdio.h>
int main()
{
int sum = 0;
int a[105] = {0};
/*for(int i = 1; i <= 100; i++)
{
for(int j = 1;j <= i; j++)
{
sum += j;
}
}
printf("%d/n", sum);*//方法一:双重循环
for(int i = 1; i <= 100; i++)
{
a[i] = a[i - 1] + i;
sum += a[i];
}
printf("%d/n", sum);
}//方法二:采用固定a[i]=a[i-1]+i的方法,节省时间

技术分享

#include<stdio.h>
int main()
{
int i,j, sum;
for(i = 1;i <= 236;i++)
{
sum = 0;
for(int j = i; sum <= 236; j++)
{
sum += j;
if(sum == 236)
{
printf("%d", i);
break;
}
}
if(sum == 236)
{
break;
}
}
}

第三题:

技术分享

#include<stdio.h>
int main()
{
int k=0;
double sum;
int a,b,c,d,e,f,g,h,i;
for( a=1;a<=9; a++)
{

for( b=1; b<=9; b++)
{
if(a!=b)
{for(c=1; c<=9; c++)
{
if(c!=a&&c!=b)
{for( d=1; d<=9; d++)
{
if(d!=a&&d!=b&&d!=c)
{for( e=1; e<=9;e++)
{
if(e!=a&&e!=b&&e!=c&&e!=d)
{for( f=1;f<=9; f++)
{
if(f!=a&&f!=b&&f!=c&&f!=d&&f!=e)
{for( g=1;g<=9;g++)
{
if(g!=a&&g!=b&&g!=c&&g!=d&&g!=e&&g!=f)
{for( h=1;h<=9;h++)
{
if(h!=a&&h!=b&&h!=c&&h!=d&&h!=e&&h!=f&&h!=g)
{for( i=1;i<=9;i++)
{
if(i!=a&&i!=b&&i!=c&&i!=d&&i!=e&&i!=f&&i!=g&&i!=h)
{
sum=a+(b*1.0)/(c*1.0)+(d*100*1.0+e*10*1.0+f*1.0)/(g*100*1.0+h*10*1.0+i*1.0);
if(10.0-sum<0.00001 && 10.0-sum>-0.00001)
k++;
}}}}}}}}}}}}}}}}}
printf("%d",k);
}

要注意的是数据类型和条件判断。

 第四快速排序


排序在各种场合经常被用到。
快速排序是十分常用的高效率的算法。

其思想是:先选一个“标尺”,
用它把整个队列过一遍筛子,
以保证:其左边的元素都不大于它,其右边的元素都不小于它。

这样,排序问题就被分割为两个子区间。
再分别对子区间排序就可以了。

下面的代码是一种实现,请分析并填写划线部分缺少的代码。

#include<stdio.h>

void swap(int a[], int i, int j)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}

int partition(int a[], int p, int r)
{
int i = p;//采用i的原因就是保持p值的不变,因为一直从第一个开始与其比较大小,但是第一个值位置却一直没有改变
int j = r + 1;//采用r+1是因为不知道r的值的奇偶性
int x = a[p];
while(1){
while(i<r && a[++i]<x);//先从小的那一边开始搜索比第一个数大的
while(a[--j]>x);//然后从另一边(大的一边)开始搜索比第一个数小的
if(i>=j) break;
swap(a,i,j);//交换找到的两个大值和小值
}
swap(a,p,j);//______________________;//要填空的地方是,因为第一个数一直作为比较值,与别的后面的数进行比较,但是位置没有改变,要将其插入其中
return j;
}

void quicksort(int a[], int p, int r)
{
if(p<r){//p和r的比较用来判断这一段数字是否比较完毕
int q = partition(a,p,r);
quicksort(a,p,q-1);
quicksort(a,q+1,r);//将这一段数字分成两段,q前面和后面
}
}

int main()
{
int i;
int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
int N = 12;

quicksort(a, 0, N-1);

for(i=0; i<N; i++) printf("%d ", a[i]);
printf("\n");

return 0;
}

第五题:

抽签

X星球要派出一个5人组成的观察团前往W星。
其中:
A国最多可以派出4人。
B国最多可以派出2人。
C国最多可以派出2人。
....

那么最终派往W星的观察团会有多少种国别的不同组合呢?

下面的程序解决了这个问题。
数组a[] 中既是每个国家可以派出的最多的名额。
程序执行结果为:
DEFFF
CEFFF
CDFFF
CDEFF
CCFFF
CCEFF
CCDFF
CCDEF
BEFFF
BDFFF
BDEFF
BCFFF
BCEFF
BCDFF
BCDEF
....
(以下省略,总共101行)

#include <stdio.h>
#define N 6
#define M 5
#define BUF 1024

void f(int a[], int k, int m, char b[])
{
int i,j;

if(k==N){
b[M] = 0;//k=N时,b[M]=0,代表要继续派走的国家名字为0,就是不需要再派人了,所以k代表的是当前的国家
if(m==0) printf("%s\n",b);//当m的值为0时,就可以输出这个国家的名字字母
return;
}
for(i=0; i<=a[k]; i++){
for(j=0; j<i; j++) b[M-m+j] = k+‘A‘;//第一层for循环是回溯的时候要找的这个国家的人数,可以是0,1,2等等,第二层for循环是用来输出这个派人去的国家名字
f(a,k+1, m-j,b);//______________________; //填空位置//m代表的是剩下还需要派走的人数
}
}
int main()
{
int a[N] = {4,2,2,1,1,3};//由此可以判断有六个国家,以及各个国家的可以去人数
char b[BUF];//代表国家的名字的字符串
f(a,0,M,b);
return 0;
}

 

 

 

蓝桥杯2016c语言习题练习(一)

标签:字母   ...   png   main   wap   这一   条件判断   习题   1.0   

原文地址:http://www.cnblogs.com/yanmengdi/p/7635832.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!