#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;
}