吉林大学超星学习通06 07 08

       狠狠在八皇后的实质不同解和链表中溺水了.......低落了好一段时间没有碰代码。链表又难又长了,我这耐心没它长。。。总之还需要继续精进,巩固链表然后统一复习后准备进军数据结构。

    希望能越走越向前吧。

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(mn)的值。

样例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。可以多看看。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值