狠狠在八皇后的实质不同解和链表中溺水了.......低落了好一段时间没有碰代码。链表又难又长了,我这耐心没它长。。。总之还需要继续精进,巩固链表然后统一复习后准备进军数据结构。
希望能越走越向前吧。
06
1. (程序题)
题目编号 :Exp07-Basic01
题目名称:复数运算
题目描述:复数可以写成A+Bi的常规形式,其中A是实部,B是虚部,i是虚数单位,满足i^2=-1。
编写程序,分别计算两个复数的和、差、积。
输入:在一行中依次给出两个复数的实部和虚部,数字间以一个西文空格分隔。
输出:一行中按照A+Bi的格式输出两虚数的和、差、积,实部和虚部均保留2位小数;
如果B是负数,则应该写成A-|B|i的形式;如果B是零则不输出虚部;结果间以4个西文空格间隔。
样例1:
输入: 2.3 3.5 5.2 0.4
输出: 7.50+3.90i -2.90+3.10i 10.56+19.12i
样例2:
输入: 3.3 4.5 3.3 -4.5
输出: 6.60 0.00+9.00i 31.14
#include<stdio.h>
int main() {
double m, n;//m实ni
struct fushu {
double a, b;
}A, B;
scanf_s("%lf%lf", &m, &n);
A.a = m;
A.b = n;
scanf_s("%lf%lf", &m, &n);
B.a = m;
B.b = n;
if (A.b + B.b > 0)
printf("%.2lf+%.2lfi ", A.a + B.a, B.b + A.b);
else if (A.b + B.b == 0)
printf("%.2lf ", A.a + B.a);
else printf("%.2lf%.2lfi ", A.a + B.a, B.b + A.b);
if (A.b - B.b > 0)
printf("%.2lf+%.2lfi ", A.a - B.a, A.b - B.b);
else if (A.b - B.b == 0)
printf("%.2lf ", A.a - B.a, A.b - B.b);
else printf("%.2lf%.2lfi ", A.a - B.a, A.b - B.b);
if (A.a * B.b + A.b * B.a > 0)
printf("%.2lf+%.2lfi", A.a * B.a - A.b * B.b, A.a * B.b + A.b * B.a);
else
if (A.a * B.b + A.b * B.a == 0)
printf("%.2lf", A.a * B.a - A.b * B.b, A.a * B.b + A.b * B.a);
else printf("%.2lf%.2lfi", A.a * B.a - A.b * B.b, A.a * B.b + A.b * B.a);
}
2. (程序题)
【计2016级期末试题】构造一个表示教师的结构体(包含3个字段:姓名、性别、年龄),编写函数,读入n个教师的信息,存入一个结构体数组中(如下图所示)。最后输出第n/2个教师的信息。
例如:一个教师的信息为zhangsan、false、50,另一个教师的信息为lisi、false、37。
输入:依次输入一个正整数n及n个教师的姓名、性别、年龄。(说明:n不大于10;姓名长度不超过20个英文字符;性别输入0/1表示女/男)。
输出:数组下标为n/2的教师信息。(说明:n/2直接截取整数,不进行四舍五入;性别输出Female/Male表示女/男;每个数据后均有1个空格)。
样例1:
输入:1 zhangsan 0 50
输出:zhangsan Female 50
样例2:
输入:4 zhangsan 0 50 lisi 1 28 wangwu 0 30 zhaoliu 1 34
输出:wangwu Female 30
样例3:
输入:5 zhangsan 0 50 lisi 1 28 wumei 0 30 zhaoliu 1 34 wangermazi 1 18
输出:wumei Female 30
#include<stdio.h>
struct teacher{
char name[20];
int gender;
int age;
}tea[10];
int main(){
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s%d%d",&tea[i].name,&tea[i].gender,&tea[i].age);
}
i=n/2;
printf("%s ",tea[i].name);
if(tea[i].gender==0) printf("Female ");
else printf("Male ");
printf("%d",tea[i].age);
}
07
1. (程序题)
题目编号:Exp06-Basic01,GJBook3-10-02
题目名称:排列组合
问题描述:编写程序求函数C(m,n)的值。
输入:从键盘随机输入一个自然数和一个非负整数,分别作为m和n的值(m≥n)。
输出:函数C(m,n)的值。
样例1:
输入:
4 1
输出:
4
样例2:
输入: 6 2 输出: 15
//学习通递归1
#include<stdio.h>
long long haha(int x){//数据大得要long long
if (x==0) return 1;
else return x*haha(x-1);//上递归 有点冗杂(?)但是简单
}
int main(){
int m,n;
long long res=0;//用result代表最后结果
scanf("%d%d",&m,&n);
if(n<0) res=0;//讨论
else if(n==0) res=1;
else if(n==1) res=m;
else if(m<2*n) {
res=haha(m)/(haha(n)*haha(m-n));
}
else if(res=haha(m-1)/(haha(m-n)*haha(n-1))+haha(m-1)/(haha(n)*haha(m-n-1)));
printf("%lld",res);//输出
return 0;
}
2. (程序题)
题目编号:Exp06-Basic02,GJBook3-10-03
题目名称:Hermite多项式
题目描述:编写程序,用递归方法求解Hermite 多项式值。Hermite 多项式定义如下。
输入:从键盘随机输入一个非负整数和一个实数,作为n和x的值。
输出:H~n~(x)的值,精确到小数点后2位。
样例1:
输入: 0 1.5
输出: 1.00
样例2:
输入: 2 2.4
输出: 21.04
//学习通递归1
#include<stdio.h>
double haha(int n,double x){//上递归
if (n == 0) return 1;
else
if (n == 1) return 2 * x;
else return 2*x*haha(n-1,x)-2*(n-1)*haha(n-2,x);
}
int main(){
int n;//习惯把题目要求量单打
double x;//为了精度几乎统统用double
scanf("%d%lf",&n,&x);
printf("%.2f",haha(n,x));
return 0;
}
3. (程序题)
题目编号:Exp06-Basic03,GJBook3-10-04
题目名称:Ackerman函数
问题描述:编写程序,计算 Ackerman 函数值。Ackerman 函数定义如下
输入:从键盘随机输入两个非负整数,分别作为m和n的值。
输出:Ack(m, n)的值。
样例1:输入 2 3 输出 9
样例2:输入 3 2 输出 29
样例3:输入 0 3 输出 4
//学习通递归1
#include<stdio.h>
int haha(int m,int n){//上递归
if(m==0) return n+1;
else if(n==0) return haha(m-1,1);
else return haha(m-1,haha(m,n-1));//递归就像是使用数学的函数
}
int main(){
int m,n;
scanf("%d%d",&m,&n);
printf("%d",haha(m,n));
return 0;
}
4. (程序题)
题目编号 :Exp06-Basic04
题目名称:最大公因数
题目描述:编写程序,用递归方法求解m、n最大公约数。对正整数u和v 可以采用欧几里德辗转相除算法求它们的最大公因数,具体过程如下:
u% v → r~1~
v % r~1~ → r~2~
r~1~% r~2~ → r~3~
r~2~ % r~3~ → r~4~
… …
r~n-1~% r~n~ → r~n+1~=0
当余数r~n+1~=0时,计算过程结束,r~n~ 为正整数u 、v的最大公因数。
输入:从键盘随机输入两个正整数m和n。输出:最大公因数。
样例1:
输入: 12 15
输出: 3
样例2:
输入: 28 49
输出: 7
//学习通递归1
#include<stdio.h>
#include<stdlib.h>
//没学会跳出 没用递归(orz)
int main(){
int m,n;
int l;
scanf("%d%d",&m,&n);
if(m<n) {//保证m大 傻瓜(指我)方法
l=m;
m=n;
n=l;
}
while(n!=0){
l=m%n;
m=n;
n=l;
}
printf("%d",m);
return 0;
}
5. (程序题)
题目编号:Exp06-Basic05,GJBook3-10-06
题目名称:顺序检索
题目描述:编写程序,用递归方法在整数组中进行顺序检索。
输入:
第一行输入一个正整数n(0<n≤100),表示数组的元素个数;
第二行依次输入n个整数,作为数组的元素;
第三行输入待检索的关键字。
输出:
如果数组中含有关键字,则输出其首次出现的位置(下标值较小的位置)否则输出NULL。
样例1:
输入: 8 0 2 3 4 5 9 10 8 3
输出: 2
样例2:
输入: 8 0 2 3 4 5 9 10 8 6
输出: NULL
//学习通递归5
#include<stdio.h>
#include<stdlib.h>
int a[101],n;//全局变量 数组内元素均为0
int sea(int i,int n1){
if(a[i]==n1){
return i;
}
else if(i==n) return -1;//判断
else return sea(i+1,n1);
}
int main(){
int n1;
int i,res;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
scanf("%d",&n1);
i=0;
res=sea(i,n1);
if(res==-1)printf("NULL");//表示
else
printf("%d",res);
return 0;
}
6. (程序题)
题目编号:Exp06-Enhance01,GJBook3-10-05
题目名称:最大元素
题目描述:编写程序,用递归方法求解长度为n的整型数组中最大元素值。
输入:第一行输入一个正整数n(0<n≤100),表示数组的元素个数;第二行依次输入n个整数,作为数组的元素。
输出:最大元素的值。
样例1:
输入: 10 9 8 7 6 5 4 3 2 1 0
输出: 9
样例2:
输入: 10 0 1 2 3 4 5 6 7 8 9
输出: 9
//学习通递归5
#include<stdio.h>
#include<stdlib.h>
int a[101];//全局变量 数组内元素均为0
int sea(int n,int max,int i){
if(i==n) return max;
else if(a[i]>max) return sea(n,a[i],i+1);
else return sea(n,max,i+1);
}
int main(){
int i;
int max=0,n;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
i=0;
max=sea(n,max,i);
printf("%d",max);
return 0;
}
7. (程序题)
题目编号:Exp06-Enhance02
题目名称:数组反序
题目描述:编写程序,用递归方法反序数组。
输入:第一行输入一个正整数n(0<n≤100),表示数组的元素个数;第二行依次输入n个整数,作为数组的元素。
输出:顺次输出逆序后数组中元素,元素间以一个西文空格间隔,最后一个元素后无字符。
样例1:
输入: 8 0 2 3 4 5 9 10 8
输出: 8 10 9 5 4 3 2 0
样例2:
输入: 5 0 2 3 3 5
输出: 5 3 3 2 0
//学习通递归5
#include<stdio.h>
#include<stdlib.h>
int a[101],b[101];//全局变量 数组内元素均为0
//全局变量不必传递参数
void sea(int n,int i){
if(i==n) return ;//递归出口
else {
b[i]=a[n-1-i];
sea(n,i+1);//递归
}
}
int main(){
int i;
int n;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
i=0;//目前本人没想到更好递增数的方法
sea(n,i);
for(i=0;i<n;i++) {
printf("%d",b[i]);
if(i!=n-1) printf(" ");
}
return 0;
}
8. (程序题)
题目编号 :Exp06-Enhance03
题目名称:截木条
题目描述:
给定一个长度为n的木条,将其在大致2/5的位置截断,得到2个长度仍为整数的木条;如果新得到的木条的长度仍旧超过规定长度k,将继续按照上述方法处理得到的木条,直到所有木条的长度都不大于k。
编写程序,用递归方法计算一个长度为n的木条,当规定长度为k时,其经过上述截断过程会得到多少根木条。其中:n、k均为正整数,且假设木条截断所得短木条长度四舍五入为正整数,长木条长度为总长减去短木条长度。
输入:顺次从键盘输入两个正整数n和k。
输出:木条根数。
样例1:
输入: 20 4
输出: 7
样例2:
输入: 3 20
输出: 1
//学习通递归5
#include<stdio.h>
#include<stdlib.h>
int i=0;//不需要数组。。。。
void sea(double n,int k){
int m=0,m1=0;
if(n>k){//先看短的
m=n*2/5+0.5;
m1=n-m;
i++;
}
if(m>k){
sea(m,k);
}
if(m1>k){
sea(m1,k);
}
return ;
}
int main(){
int k;
double n;
scanf("%lf%d",&n,&k);
sea(n,k);
if(n*5/3<k) printf("1");
else printf("%d",i+1);
return 0;
}
9. (程序题)
题目编号 :Exp06-Enhance05,freshman-1022
题目名称:十进制转换任意进制
题目描述:编写程序,用递归方法将十进制的非负整数 N 转换为 b 进制数(2≤b≤36),其中字符、ASCII码值和数值之间的对应关系如下:
输入:一行输入两个非负整数,分别是十进制的 N 和 b ,其中 0 <=N <=2^31 ,2 <=b <= 36 。
输出:N 的 b 进制数。
样例1:
输入: 579 8
输出: 1103
样例2:
输入: 579 20
输出: 18J
#include<stdio.h>
char a[35];
int i=0;
void jz(long long N, long long b){
if(N%b>=10) a[i]=(char)(N%b+48+7);
else a[i]=(char)(N%b+48);
N=N/b;
i++;
if(N>0){
jz(N,b);
}
else return ;
}
int main(){
long long N,b;
scanf("%lld%lld",&N,&b);
jz(N,b);
for(i--;i>=0;i--){
printf("%c",a[i]);
}
return 0;
}
08
1. (程序题, 40分)
题目编号:Exp08-Basic01,GJBook3-12-05
题目名称:正整数分解
题目描述:正整数n,按第一项递减的顺序依次输出其和等于n的所有不增的正整数和式。
输入:一个正整数n(0<n≤15)。
输出:每行输出如样例所示,和等于n的不增正整数和式,数字和运算符间无符号,最后一行结尾有一个回车换行符。
样例:
输入: 4
输出: 4=3+1 4=2+2 4=2+1+1 4=1+1+1+1
#include<stdio.h>
#include<string.h>
int a[16],k;
void fj(int n,int n1,int i1){
int i;
if(n==0){
printf("%d=",i1);
for(i=0;i<k-1;i++){
printf("%d+",a[i]);
}
printf("%d\n",a[k-1]);
return ;
}
for(i=n1;i>0;i--){
a[k++]=i;
if(n-i>=0) fj(n-i,i,i1);
k--;
}
return ;
}
int main(){
int n;
scanf("%d",&n);
fj(n,n-1,n);
return 0;
}
2. (程序题, 40分)
题目编号:Exp08-Basic02,GJBook3例-12-02
题目名称:N皇后问题
题目描述:
八皇后问题由高斯(C. F. Gauss)最早在1850年提出并研究,但并未完全解决。N皇后问题指在一个N×N的棋盘上放置N个皇后,使任意两个皇后都不能互相攻击。按国际象棋规则,两个皇后,若在同一行上,或在同一列上, 或在同一条斜线上, 则她们可以互相攻击。下图即满足八皇后条件的一种棋局。
编写程序给出满足条件的棋局数目。
输入:一个正整数N(0<N≤13)输出:棋局数目
样例1:
输入: 2
输出: 0
样例2:
输入: 8
输出: 92
#include<stdio.h>
#include<math.h>
//考虑用对称 但是此外还要考虑本身对称的情况 遂作罢
int a[14]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
//每行所在列 -1后面方便标记
int way=0,n;
int ok(int i,int j){//判断该位置是否ok
int i1;//行
for(i1=1;i1<i;i1++){
if(j==a[i1]) return 0;//列一样 撤
if((i-i1)==-(j-a[i1])) return 0;
//副对角线上 撤
if((i-i1)==(j-a[i1])) return 0;
//主对角线 撤
}
return 1;
}
void begin(int queen){
int i;
for(i=1;i<n+1;i++){//遍历放n个空位
if(ok(queen,i)==1){//给进行和列
a[queen]=i;//记录
if(queen==n){//一种方法结束
way++;
return ;
}
int next;//没完继续
next=queen+1;
begin(next);
}
}
a[--queen]=-1;//这行没有位置放 上一行重置
}
int main()
{
scanf("%d",&n);
begin(1);
printf("%d",way);
return 0;
}
八皇后有好几种方法,我看完了打了两个觉得这个两个之中比较简洁比较orz。可以多看看。