C语言题目14

//实现输入任意两个若干位的整数,进行加法,计算并返回加和后的结果。
//(注意两个整数可以足够大,以至于double都会溢出。只要系统内存够用,
//此加法都要正常运行)
#include"stdio.h"
#include"stdlib.h"
typedef struct node{
  int x;
  struct node *next;
  struct node *before;
}llnode;

int charToNumber(char c)
{
  return c-48;
}

void getNumber(llnode* tail)
{
  char c;
  llnode *p;
  llnode *q;
  q = tail;
  printf("请输入一个整数, 输入完成后敲击回车:");
  while(1)
    {
      c = getchar();
      if(c == '\n')
	{
	  break;
	}
      else
	{
	  p = (llnode *)malloc(sizeof(llnode));
	  p->x = charToNumber(c);
	  p->before = NULL;
	  if(tail->x == 0)
	    {
	      tail->before = p;
	      p->next = tail;
	      tail->x = tail->x+1;
	    }
	  else
	    {
	      q = tail->before;
	      q->next = p;
	      p->before = q;
	      p->next = tail;
	      tail->before = p;
	      q = p;
	      tail->x = tail->x+1;
	    }
	}
    }
}

void addNumber(llnode* ctail, llnode* atail, llnode* btail)
{
  int i=0;
  int alength = atail->x;
  int blength = btail->x;
  llnode *pshort;
  llnode *plong;
  llnode *ps;
  llnode *pl;
  llnode *p;
  llnode *q;
  int a;
  int b;
  int nextc;
  int thisc;
  int d;
  if(alength>blength)
    {
      pshort = btail;
      plong = atail;
    }
  else
    {
      pshort = atail;
      plong = btail;
    }
  ps = pshort->before;
  pl = plong->before;
  while(i<pshort->x)
    {
      thisc = nextc;
      if(ps->x + pl->x >=10)
	{
	  nextc = 1;
	  d = (ps->x + pl->x)%10;
	}
      else
	{
	  nextc = 0;
	  d = (ps->x + pl->x);
	}
      ps = ps->before;
      pl = pl->before;
      p = (llnode *)malloc(sizeof(llnode));
      p->x = d+thisc; 
      p->before = NULL;
      if(ctail->x == 0)
	{
	  ctail->before = p;
	  p->next = ctail;
	  ctail->x = ctail->x+1; 
	  q = p;
	}
      else
	{
	  p->next = q;
	  q->before = p;
	  q = p;
	  ctail->x = ctail->x+1;
	}
      i = i+1;
    }
  while(i<plong->x)
    {
      if(i == pshort->x)
	{
	  p = (llnode *)malloc(sizeof(llnode));
      	  p->x = (pl->x)+nextc; 
      	  p->before = NULL;
      	}
      else
      	{
	  p = (llnode *)malloc(sizeof(llnode));
      	  p->x = pl->x;
	  p->before = NULL;
      	}
      p->next = q;
      q->before = p;
      q = p;
      ctail->x = ctail->x+1;
      pl = pl->before;
      i = i+1;
    }
}

void showResult(llnode* ctail)
{
  llnode *p;
  p = ctail;
  while(p->before != NULL)
    {
      p = p->before;
    }
  while(p != ctail)
    {
      printf("%d",p->x);
      p = p->next;
    }
  printf("\n");
}

int main()
{
  llnode *atail = (llnode *)malloc(sizeof(llnode));
  llnode *btail = (llnode *)malloc(sizeof(llnode));
  llnode *ctail = (llnode *)malloc(sizeof(llnode));
  llnode *p=atail;
  atail->x = 0;
  btail->x = 0;
  ctail->x = 0;
  atail->next = NULL;
  btail->next = NULL;
  ctail->next = NULL;
  getNumber(atail);
  getNumber(btail);
  addNumber(ctail, atail, btail);
  showResult(ctail);
  return 1;
}

C语言题目7

//已知n=0, f(n)=0; n=1, f(n)=1; n>=2, f(n)=[f(n-1)+1]*[f(n-2)-1], 求f(50)。
//注意:double也只能存储到f(18)。这道题应该不会是要考大整数乘法,所以题目出的有问题。
//这道题也可以用递归,但是递归运行速度比较慢,因为有大量重复计算,所以可以按照我的方法用链表。
//如果真的想要求出f(50),可以用链表存储两个计算因子和计算结果,转化成大整数加法,来求大整数乘法。
//把乘法转化成加法计算,比如3×4 = 4+4+4
//以下是前20个数字的运行结果
//0:0.000000
//1:1.000000
//2:-2.000000
//3:-0.000000
//4:-3.000000
//5:2.000000
//6:-12.000000
//7:-11.000000
//8:130.000000
//9:-1572.000000
//10:-202659.000000
//11:318781034.000000
//12:-64604164553100.000000
//13:-20594582312338883346432.000000
//14:1330495784608724577563601617989664768.000000
//15:-27401004952344282189274505435890321300250290209030873808896.000000
//16:-36456921583136852485661222029923476042013772777779791392989314785761343035841829994866675810304.000000
//17:9989562888467599682490178454054145458467604867235829190066412851063708189685362766757643907501070026206
//55223767942258990500160700908909006358607921414144.000000
//18:-364188710874677328890688166883341655997440487840343568582579911102615655287833051471441667841754329590
//03497968188602575038253510532501707167150463676880377107100124867120157208280951966764835855418677107978
//345178504768013589268641567045778554224640.000000
//19:-inf
//20:inf


#include"stdio.h"
#include"stdlib.h"

typedef struct node{
  double x;
  struct node *next;
}llnode;

void generate(llnode *head, int n)
{
  llnode *p;
  llnode *m;
  double fn2 = 0;
  double fn1 = 0;
  int i = 0;
  if(n==1)
    {
      m = (llnode *)malloc(sizeof(llnode));
      m->x = 1;
      m->next = NULL;
      head->next = m;
    }
  else
    {
      p = head;
      while(i<n-2)
	{
	  p = p->next;
	  i = i+1;
	}
      fn2 = p->x;
      p = p->next;
      fn1 = p->x;
      m = (llnode *)malloc(sizeof(llnode));
      m->x = (fn1+1)*(fn2-1);
      m->next = NULL;
      p->next = m;
    }
}

double f(llnode* head, int n)
{
  int i=0;
  llnode *p = head;
  while(i<n)
    {
      p = p->next;
      i = i+1;
    }
  return p->x;
}

int main()
{
  llnode *head;
  int n = 0;
  int last = 20;//要求的最大结果
  double result=0;
  head = (llnode *)malloc(sizeof(llnode));
  head->x = 0;
  head->next = NULL;
  for(n=1; n<=last; n++)
    {
      generate(head, n);
    } 
  for(n=0; n<=last; n++)
    {
      result = f(head, n);
      printf("%d:", n);
      printf("%lf\n", result);
    }
  return 1;
}