某日三道C算法题目

来源:互联网 发布:包头广电网络客服电话 编辑:程序博客网 时间:2024/05/18 09:05

1.编写一个函数,计算给定的一个矩阵(mXn)的转置矩阵,主函数输入给定矩阵并输出转置矩阵

#include<stdio.h>
#include"stdlib.h"
void main(){
 int m,n,i,j;
 int * * matrix;
 printf("请输入所要求矩阵的维数(m*n):\n");
 scanf("%d %d",&m,&n);
 matrix=(int **)malloc(m*sizeof(int *));
 printf("请输入矩阵数据:\n");
 for(i=0;i<m;i++){
  matrix[i]=(int *)malloc(n*sizeof(int));
  for(j=0;j<n;j++){
   int x=0;
   scanf("%d",&x);
   matrix[i][j]=x;
  }
 }
 printf("原矩阵(m*n):\n");
 for(i=0;i<m;i++){
  for(j=0;j<n;j++){
   printf("%d\t",matrix[i][j]);
  }
  printf("\n");
 }
 printf("转置矩阵(m*n):\n");
 for(j=0;j<n;j++){
  for(i=0;i<m;i++){
  
   printf("%d\t",matrix[i][j]);
  }
  printf("\n");
 }
}

2.编写一个函数abc用来建立一个带头结点的单向链表,新产生的节点总是插在链表的末尾,节点数域中的函数值从键盘输入,以字符“!”作为结束标志,单向链表的头指针作为函数值返回

#include<stdio.h>
#include<malloc.h>

#define NULL 0
#define LEN sizeof(List)
typedef char ElemType;
typedef struct node
{
    ElemType data;
    struct node * next;
}List;
int size=0;                                               //链表长度
List *p2=(List*)malloc(sizeof(List));                     //存储尾节点  
List *abc()                                               //初始化单链表
{
    List * head=NULL;
    List * p1;
    p1=(List*)malloc(LEN);
    head=NULL;
    printf("请输入要插入链表的数据(输入!结束):\n");
    scanf("%c",&p1->data);
    while(p1->data!='!')
    {
        size++;
        if(size==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(List*)malloc(LEN);
        scanf("%c",&p1->data);
    }
    free(p1);
    p2->next=NULL;
    return head;
}
void Print(List * head)                           //遍历链表并输出
{
    List * p;
    p=head;
    if(head!=NULL){
  printf("head->[%c]",p->data);
        p=p->next;
  if(p!=NULL){
        do
        {
            printf("->[%c]",p->data);
            p=p->next;
  }while(p!=NULL);}
  printf("\n");
 }
}

void addNode(List * &head){                         //增加节点
 List * p1;
    p1=(List*)malloc(LEN);
 printf("输入要添加的节点(输入!结束):");
    scanf("\n%c",&p1->data);
 while(p1->data!='!'){
  size++;
  if(size==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(List*)malloc(LEN);
        scanf("%c",&p1->data);
 }
     free(p1);
    p2->next=NULL;

}
void main()
{
 List * head;
    head=abc();
    Print(head);
 addNode(head);
 Print(head);
}

 

3.编写递归程序,计算两个正整数的最大公约数和最小公倍数

#include <stdio.h>
#include "stdlib.h"


int GetMaxGys(int m,int n)//递归求最大公约数
{

 if (m==n){
  return m;
 }else if (m>n){
  GetMaxGys(m-n,n);
 }else{
  GetMaxGys(n-m,m);
 }
}

void main()
{
  int a,b;
  int maxgys,mingbs;
  printf("%s\n","请输入两个数:");
  scanf("%d%d",&a,&b);
  maxgys=GetMaxGys(a,b);
  mingbs=a*b/maxgys; //用最大公约数求最小公倍数
  printf("%s","这两个数的最大公约数为:");
  printf("%d\n",maxgys);
  printf("%s","这两个数的最小公倍数为:");
  printf("%d\n",mingbs);
  system("pause");
}

原创粉丝点击