就是放了一些代码没什么用
/*
比递归的剪枝更好的尾递归解法(比递推差)时间复杂度和递推一样,空间复杂度和递归一样
*/
#include<stdio.h>
#include<stdlib.h>
unsigned long fiboProcess(unsigned long n,unsigned long prePreVal,
unsigned long preVal,unsigned long begin){
if(n == begin)
return preVal+prePreVal;
else{
begin++;
return fiboProcess(n,preVal,prePreVal+preVal,begin);
}
}
unsigned long fibo(unsigned long n){
if(n <= 1)
return n;
else
return fiboProcess(n,0,1,2);
}
int main(int argc,char *argv[]){
int n;
scanf("%d",&n);
unsigned long fiboNum = fibo(n);
printf("the %lu result is %lu\n",n,fiboNum);
return 0;
}
/*
鸡肋的高精度
*/
#include<stdio.h>
#include<string.h>
#define MAXN 1500
char qian[MAXN]={'1'},hou[MAXN]={'1'},ans[MAXN];
void start(char *ans){
for(int i=0;i<1500;i++){
ans[i]=48;
}
}
void fbnazy(char *a,char *b,int len_a,int len_b);
int main(){
start(ans);
int n,i,len_a,len_b;
int flag=0;
scanf("%d",&n);
for(i=1;i<n;i++){
len_a=strlen(qian);len_b=strlen(hou);
qian[len_a]=48;
hou[len_b]=48;
fbnazy(qian,hou,len_a,len_b);
}
int len = strlen(hou);
for(i=len-1;i>=0;i--){
if(hou[i] == 48 && flag == 0) continue;
else if(hou[i] == 48) printf("%c",hou[i]);
else if (hou[i] != 48){
printf("%c",hou[i]);
flag=1;
}
}
return 0;
}
//主要在下面这块
void fbnazy(char *a,char *b,int len_a,int len_b){
int len=(len_a > len_b?len_a:len_b);
int i,d=0,*tmep;
for(i=0;i<len;i++){
ans[i]=a[i]+b[i]+d-48;
d=0;
while(ans[i] >= 58){
ans[i]-=10;
d++;
}
}
if(d > 0){
ans[len]=d+48;
}
for(i=0;i<=len;i++){
a[i]=b[i];
b[i]=ans[i];
}
}
/*
求质因数分解,N!的质因数
*/
#include<math.h>
#include<stdio.h>
#include<string.h>
#define MAXLEN 10001
int primenumber[MAXLEN]={0};
int prime(int number){
int tap;
if(number == 1 || number == 0) return 0;
for(tap=2;tap<=sqrt(number);tap++){
if(number % tap == 0) return 0;
}
return 1;
}
void soluprime(int number,int *primenumber){// 运用剪枝的递归
int i,j=0;
if(prime(number) == 1){
primenumber[number]++;
}
else {
for(i=2;i<number;i++){
if(primenumber[i] != 0) j=i;//关键的剪枝部分,虽然好像不是很好,遍历一下
if(number % j == 0){
primenumber[j]++;
soluprime(number/j,primenumber);
break;
}
}
}
}
int main(){
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++){
soluprime(i,primenumber);
}
for(i=1;i<=n;i++){
if(primenumber[i] != 0){
printf("%d %d\n",i,primenumber[i]);
}
}
return 0;
}
/*
比较完整的求质因数的代码,可以使因子从小到大输出,10^15一样的快速
*/
#include<stdio.h>
void prime(long long number){
int tap;
if(number == 1 || number == 0) printf("over");
else {
for(tap=2;tap<=number;tap++){
if(number % tap == 0) {
printf("%d ",tap);
prime(number/tap);
break;
}
}
}
}
int main(){
long long n;
scanf("%lld",&n);
prime(n);
return 0;
}
/*
将学生信息输入,按成绩排序,如相同按学号从小到大排序
*/
#include<stdlib.h>
#include<stdio.h>
typedef struct birthday{
int day;
int month;
int year;
} b;
typedef struct Students{
int nums;
char name[20];
int sore;
char sex;
b birthday;
} s;
int compare_and_swap(s *a,s *b){
s temp;
if(a->sore > b->sore || (a->sore == b->sore && a->nums < b->nums)){
temp=*a;
*a=*b;
*b=temp;
}
}
int main(){
s *stu;
int n,i,j;
scanf("%d",&n);
stu=calloc(n,sizeof(s));
for(i=0;i<n;i++)
scanf("%d %s %d %c %d %d %d",&stu[i].nums,stu[i].name,
&stu[i].sore,&stu[i].sex,&stu[i].birthday.year,&stu[i].birthday.month
,&stu[i].birthday.day);
for(i=0;i<n;i++){
for(j=0;j<n-1-i;j++){
compare_and_swap(stu+j+1,stu+j);
}
}
for(i=0;i<n;i++)
printf("%d %s %d %c %d %d %d\n",stu[i].nums,stu[i].name,
stu[i].sore,stu[i].sex,stu[i].birthday.year,stu[i].birthday.month
,stu[i].birthday.day);
return 0;
}
/*
c语言中 qsort() 函数的应用
*/
int compare(const void *a,const void *b){
int *p1=a,*p2=b;
if(*p1 < *p2) return 1;
else if(*p1 > *p2) return -1;
else return 0;
}
int main(){
qsort(number,n,sizeof(int),compare);
}
/*
斐波那契的全局变量,尾部递归,指针运用;
简便的整形数组比较的方法;
发现:尾部递归和全局变量和指针一起用比较好用
*/
#include<stdio.h>
#define MAXN 1001
int fibo[MAXN]={0,1,1};// 全局变量
void fibonazy(int number,int *fibo){
if(number == 0 ||number == 1 || number == 2);
else {
fibonazy(number-1,fibo);//尾部递归
*(fibo+number)=*(fibo+number-1)+*(fibo+number-2);//指针
}
}
int compare(const int *a,const int *b,const int len){//用于整形数组的比较,相同输出1,不同输出0;
int count=0;
while(*a++ == *b++ && ++count);//这里很妙,*a++ == *b++是先进行*a和*b的比较然后再进行++(注意:while(a++)不会先进行下面的程序再进行a++而是a加了1后再执行下面的程序,因为while括号内的已经是一个表达式了,x++是整个表达式执行完成后再加1的),其次再利用&&的性质如果前面的a和b不相等那么就不会执行count++的命令可以精确的算出有多少个数组的元素相同
if(count == len ) return 1;
else return 0;
}
int main(){
int n,i,j,f[MAXN];
scanf("%d",&n);
fibonazy(n,fibo);
for(i=0;i<n;i++)
scanf("%d",&f[i]);
if(compare(f,fibo,n)) printf("Yes");
else printf("No");
return 0;
}
// 栈的应用:洛谷工程题
// 题目:https://www.luogu.com.cn/problem/P1010
// 利用函数的递归使用其实就是一个先进后出的栈的结构
#include <stdio.h>
#include <stdlib.h>
int turnto(int n, int *a)
{
int i = 0;
while (n > 0)
{
a[i++] = n % 2;
n /= 2;
}
return i - 1;
}
void process(int n)
{
int decimal[15]; // 每次的decimal都保存在这个栈的结构里了,防止再次用turnto函数时decimal里的数据被覆盖
int len = turnto(n, decimal);
for (int i = len; i >= 0; i--)
{
if (decimal[i] == 1)
{
printf("2");
if (i > 2)
{
printf("(");
process(i);
printf(")");
}
else if (i == 2 || i == 0)
{
printf("(");
printf("%d", i);
printf(")");
}
for (int j = i - 1; j >= 0; j--)
{
if (decimal[j] == 1)
{
printf("+");
break;
}
}
}
}
}
int main()
{
int n;
scanf("%d", &n);
process(n);
system("pause");
return 0;
}