PTA[函数题]

求m到n之和
int sum(int m,int n){
    int sum=0;
    for(m;m<=n;m++){
        sum+=m;
    }
    return sum;
}
找两个数中最大者
int max(int x,int y){
    if(x>y)
        return x;
    else
        return y;
}
字符金字塔
void CharPyramid( int n, char ch){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n-i;j++)
            printf(" ");
        for(int z=1;z<=i;z++)
            printf("%c ",ch);
        printf("\n");
    }return;
}
符号函数
int sign( int x ){
    if(x>0)
return 1;
    if(x==0)
return 0;
    if(x<0)
return -1;

}
使用函数求奇数和
int even(int n){
    if(n%2==1||n%2==-1)
        return 0;
    else
        return 1;
}
int OddSum(int List[],int N){
    int i,sum=0;
    for(i=0;i<N;i++){
        if(even(List[i])==0)
            sum+=List[i];
    }
return sum;}
使用函数计算两点间的距离
double dist( double x1, double y1, double x2, double y2 ){
    double s;
    s=(y2-y1)*(y2-y1)+(x2-x1)*(x2-x1);
    return sqrt(s);
}
使用函数求素数和
int prime(int p){
    int i;
    if(p<=1){
        return 0;}
    else if(p==2){
        return 1;}
    else{  
        for(i=2;i<p;i++){
        if(p%i==0){
            return 0;}
}
        return 1;}
}
int PrimeSum(int m,int n){
    int sum=0;
    for(int i=m;i<=n;i++){
        if(prime(i)==1)
            sum+=i;
}return sum;
}
使用函数统计指定数字的个数
int CountDigit( int number, int digit ){
    int c=0;
    if(number<0)number=-number;
    if(number==0){
        if(number==digit)
            c++;
    }
    while(number!=0){
        int a;
        a=number%10;
        if(a==digit)c++;
        number/=10;
    }return c;
}
使用函数输出水仙花数
#include<math.h>
int narcissistic( int number ){
    int sum=0;
    int x=number;
    int n=0;
    do{
        x/=10;
        n++;
    }while(x!=0);
        x=number;
    do{
        int a;
        a=x%10;
        sum+=pow(a,n);
            x/=10;
    }while(x!=0);
    if(sum==number)return 1;
    else return 0;
}
void PrintN( int m, int n ){
    for(int i=m+1;i<n;i++){
        if(narcissistic(i)==1)
            printf("%d\n",i);
    }
}
使用函数求余弦函数的近似值
double funcos( double e, double x ){
    double a,s,i,j,b=1.0;
    int f=1;
    a=1;
    s=0;
    i=2;
    while(fabs(a)>=e){
        b=1;
        s=s+a;
        for(j=1.0;j<=i;j++){
            b=b*j;
        }
        a=pow(x,i)/b;
        f=-f;
        a=f*a;
        i+=2;
    }
    s+=a;
    return s;
}
空心的数字金字塔
void hollowPyramid( int n ){
    for(int i=1;i<=n;i++){
    for(int j=1;j<=n-i;j++){
        printf(" ");
    }
        printf("%d",i);
        if(i==1)printf("\n");
        if(i>1&&i<n){
        for(int k=1;k<=i*2-3;k++){
            printf(" ");
        }printf("%d",i);
            printf("\n");
            }
        if(i==n)for(int x=1;x<=i*2-2;x++){
            printf("%d",i);
        }
    }
}
分类统计字符个数
void StringCount( char s[] ){
    int i;int l,b,d,o;
    l=b=d=o=0;
    for(i=0;s[i]!='\0';i++){
        scanf("%c",&s[i]);
        if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z')l++;
        else if(s[i]==' '||s[i]=='\n')b++;
        else if(s[i]>='0'&&s[i]<='9')d++;
        else o++;
    }
    printf("letter = %d, blank = %d, digit = %d, other = %d",l,b,d,o);
}
使用函数求特殊a串数列和
int fn( int a, int n ){
    int sum=a;
    for(int i=1;i<n;i++){
    sum=sum*10+a;
    }
    return sum;
}
int SumA( int a, int n ){
    int sum=0;
    for(int i=1;i<=n;i++){
        sum+=fn(a,i);
    }return sum;
}
使用函数输出指定范围内的完数
int factorsum( int number ){
    int sum=0;
    for(int i=1;i<=number/2;i++){
        if(number%i==0){
            sum+=i;
        }
    }
    return sum;
}
void PrintPN( int m, int n ){
    int z=0;
    for(int i=m;i<=n;i++){
        if(factorsum(i)==i){
            printf("%d = 1",i);
            for(int j=2;j<=i/2;j++)
            {
                if(i%j==0)
                    printf(" + %d",j);
        }
                printf("\n");
        z++;} 
}if(z==0)printf("No perfect number");
}
使用函数输出指定范围内的Fibonacci数
int fib( int n ){
    if(n<=2)return 1;
    int a=1,b=1,c;
    if(n>2){for(int i=3;i<=n;i++){
        c=a+b;
        a=b;
        b=c;
    }
    return b;}
}
void PrintFN( int m, int n ){
    int a;int c=0;
    for(int i=1;i<25;i++){
        a=fib(i);
        if(a>=m&&a<=n){
            if(c>0)printf(" ");
            printf("%d",a);
            c++;
        }
    }if(c==0)printf("No Fibonacci number");
}
使用函数验证哥德巴赫猜想
int prime( int p ){
    if(p==1)return 0;
    if(p==2)return 1;
    if(p>2){
        for(int i=2;i<=p/2;i++){
            if(p%i==0)return 0;
        }return 1;
    }
}
void Goldbach( int n ){
    for(int i=2;i<=n/2;i++){
        if(prime(i)==1&&prime(n-i)==1){
                printf("%d=%d+%d",n,i,n-i);
                break;
            
        }
    }
}
使用函数输出一个整数的逆序数
int reverse( int number ){
    int sum=0;
    while(number){
        int a;
        a=number%10;
        sum=sum*10+a;
        number/=10;
    }
    return sum;
}
计算两数的和与差
void sum_diff( float op1, float op2, float *psum, float *pdiff ){
    *psum=op1+op2;
    *pdiff=op1-op2;
}
数组循环右移
void ArrayShift( int a[], int n, int m ){
    for(int i=0;i<m;i++){
        int left=a[n-1];
        for(int j=n-1;j>0;j--){
            a[j]=a[j-1];
        }
        a[0]=left;
    }
}
移动字母
void Shift( char s[] ){
int n=strlen(s);
    for(int i=0;i<3;i++){
        int a=s[0];
        for(int j=0;j<n-1;j++){
            s[j]=s[j+1];
        }
        s[n-1]=a;
    }
}
拆分实数的整数与小数部分
void splitfloat( float x, int *intpart, float *fracpart ){
    *intpart=x;
    *fracpart=x-*intpart;
}
在数组中查找指定元素
int search( int list[], int n, int x ){
    int a;int c=0;
    for(int i=0;i<n;i++){
        if(list[i]==x){
            a=i;c++;
            break;
        }
    }if(c>0)return a;
    return -1;
}
使用函数实现字符串部分复制
void strmcpy( char *t, int m, char *s ){
    t=t+m-1;
    while(*t!='\0'){
        *s=*t;
        s++;
        t++;
    }
    *s='\0';
}
删除字符
void delchar( char *str, char c ){
    int n=strlen(str);int j,i;
    for(i=0,j=0;i<n;i++){
        if(str[i]==c)continue;
        else {
            str[j]=str[i];
            j++;
        }
    }
    str[j]='\0';
}
判断回文字符串
bool palindrome( char *s ){
    int i=0,j=strlen(s)-1;
    while(i<j){
        if(s[i]!=s[j]) return false;
        i++;
        j--;
    }
    return true;
}
分类统计各类字符个数
void StringCount( char *s ){
    int a=0,b=0,c=0,d=0,e=0;
    while(*s!='\0'){
        if(*s>='A'&&*s<='Z')a++;
        else if(*s>='a'&&*s<='z')b++;
        else if(*s==' ')c++;
        else if(*s>='0'&&*s<='9')d++;
        else e++;
        s++;
    }
    printf("%d %d %d %d %d",a,b,c,d,e);
}
计算两个复数之积
struct complex multiply(struct complex x, struct complex y){
    struct complex sum;
    sum.real=x.real*y.real-x.imag*y.imag;
    sum.imag=x.real*y.imag+x.imag*y.real;
    return sum;
}
按等级统计学生成绩
int set_grade( struct student *p, int n ){
    int c=0;
    for(int i=0;i<n;i++){
         if((*(p+i)).score>=85&&(*(p+i)).score<=100)(*(p+i)).grade='A';
         if((*(p+i)).score>=70&&(*(p+i)).score<=84)(*(p+i)).grade='B';
         if((*(p+i)).score>=60&&(*(p+i)).score<=69)(*(p+i)).grade='C';
         if((*(p+i)).score>=0&&(*(p+i)).score<=59){(*(p+i)).grade='D';c++;}
    }return c;
}
判断满足条件的三位数
int pingfan(int n){
double a;
int b;
a=pow(n,0.5);
b=pow(n,0.5);
if((a-b)==0)return 1;
else return 0;
}
int search( int n ){
    int falt;int a[3];int c=0;
    for(int i=101;i<=n;i++){
        int x=i;falt=0;
        if(pingfan(i)){int k=0;
            while(x){
                a[k++]=x%10;
                x/=10;
            }
                       for(int j=0;j<2;j++){
                           int b=a[j];
                           for(int z=j+1;z<3;z++){
                               if(b==a[z])falt=1;
                           }
                       }
                       if(falt)c++;
        }
        else continue;
    }
    return c;
}
使用递归函数计算1到n之和
int sum( int n ){

    return n+sum(n-1);
}
递归求阶乘和
double fact( int n ){
    if(n<=0)return 1;
     return n*fact(n-1);
}
double factsum( int n ){
    if(n<=0)return 0;
     return fact(n)+factsum(n-1);
}
递归实现指数函数
double calc_pow( double x, int n ){
    if(n<=0)return 1;
    else return x*calc_pow(x,n-1);
}
递归求简单交错幂级数的部分和
#include<math.h>
double fn( double x, int n ){
if(n<=0)return 0;
    else return pow(-1,n-1)*pow(x,n)+fn(x,n-1);
}
递归计算Ackermenn函数
int Ack( int m, int n ){
    if(m==0)return n+1;
    if(n==0&&m>0)return Ack(m-1,1);
    if(m>0&&n>0)return Ack(m-1,Ack(m,n-1));
}
递归求Fabonacci数列
int f( int n ){
    if(n==0)return 0;
    else if(n==1)return 1;
    else return f(n-1)+f(n-2);
}
十进制转换二进制
void dectobin( int n ){
    int m;
    m=n%2;
    if(n>=2)dectobin(n/2);
    putchar(m==0?'0':'1');
    return ;
}
递归实现顺序输出整数
void printdigits( int n ){
    int a;
    if(n<10)printf("%d\n",n);
    else {
        a=n%10;
        printdigits(n/10);
        printf("%d\n",a);
    }
    return ;
}
递归求逆序数
unsigned int reverse( unsigned int number ){
int x=number;int n=0;
    while(x){
        x/=10;
        n++;
    }if(number==0)return 0;
    return reverse(number/10)+number%10*pow(10,n-1);
}
最大公约数(递归版)
int Gcd(int x, int y){
    if(x==0&&y==0)return 1;
    else if(x==0&&y!=0)return y;
    else if(x!=0&&y==0)return x;
    else if(x%y==0)return y;
    else return Gcd(y,x%y);
}
报数
void CountOff(int n,int m,int out[]){
    int i,j,k;
    for(i=0;i<n;i++){
        out[i]=0;
    }
    for(k=0,i=1,j=1;j<=n;k=(1+k)%n){
        if(out[k]==0){
            if(i==m){
                out[k]=j;
                j++;
                i=0;
            }
            i++;
        }
    }
}
有序表的增删改查操作
 
int insert(int a[ ], int value) {
    int i = 0;
    for (i = 0; i < Count; i++)
        if (a[i] == value)
            return -1;
    i = 0;
    while (i < Count ) {
        if (a[i] > value)
            break;
        i++;
    }
    if (i == Count)
        a[i] = value;
    else {
        int tmp1 = a[i], tmp2;
        a[i] = value;
        while (i < Count) {
            i++;
            tmp2 = a[i];
            a[i] = tmp1;
            tmp1 = tmp2;
        }
    }
    Count++;
    return 1;
}
 
int del(int a[ ], int value) {
    int i = 0, j = 0, flag = 1;
    for (i = 0; i < Count; i++) {
        if (a[i] == value) {
            for (j = i; a[j] != '\0'; j++)
                a[j] = a[j + 1];
            flag = 0;
        }
    }
    if (flag)
        return -1;
    Count--;
    return 1;
}
 
int modify(int a[ ], int value1, int value2) {
    int i, flag = 1;
    for (i = 0; i < Count; i++) {
        if (a[i] == value2)
            return -1;
        if (a[i] == value1)
            flag = 0;
    }
    if (flag)
        return -1;
    for (i = 0; i < Count; i++)
        if (a[i] == value1) {
            a[i] = value2;
            break;
        }
    for (i = 0; i < Count; i++)
        for (int j = i + 1; j < Count; j++)
            if (a[j] < a[i]) {
                int tmp = a[j];
                a[j] = a[i];
                a[i] = tmp;
            }
    return 1;
}
 
int query(int a[ ], int value) {
    int before = 0, after = Count - 1;
    while (before <= after) {
        int mid = (before + after) / 2;
        if (a[mid] > value)
            after = mid - 1;
        else if (a[mid] < value)
            before = mid + 1;
        else
            return mid;
    }
    return -1;
}
字符定位(最后一次找到的字符)
char * match(char *s, char ch)
{
    char *p=NULL;
    int i;
    for(i=0;s[i]!='\0';i++)
    {
        if(s[i]==ch)
            p=s+i;
    }
        return p;
}
输出月份英文名
char *getmonth( int n ){
    if (n < 1 || n > 12){
        return NULL;
    } else {
        switch (n){
            case 1: return "January";
            case 2: return "February";
            case 3: return "March";
            case 4: return "April";
            case 5: return "May";
            case 6: return "June";
            case 7: return "July";
            case 8: return "August";
            case 9: return "September";
            case 10: return "October";
            case 11: return "November";
            default : return "December";
        }
    }
}
 查找星期
int getindex( char *s ){
    if (strcasecmp(s, "Sunday") == 0){
        return 0;
    } else if (strcasecmp(s, "Monday") == 0){
        return 1;
    } else if (strcasecmp(s, "Tuesday") == 0){
        return 2;
    } else if (strcasecmp(s, "Wednesday") == 0){
        return 3;
    } else if (strcasecmp(s, "Thursday") == 0){
        return 4;
    } else if (strcasecmp(s, "Friday") == 0){
        return 5;
    } else if (strcasecmp(s, "Saturday") == 0){
        return 6;
    } else {
        return -1;
    }
}
计算最长的字符串长度
int max_len( char *s[], int n ){
    int max=0;//假设max为s[0] 
    int i,j;
    
    for(i=0;i<n;i++){
        if(strlen(s[max])<strlen(s[i])){
            max=i;    
        }
    }    
    return strlen(s[max]);

 字符串的连接
char *str_cat(char *s, char *t)
{
    int len;
    int i;
    len = strlen(s);
    for (i = 0; *(t + i) != '\0'; i++)
    {
        *(s + i + len) = *(t + i);
    }
 
    return s;
}
指定位置输出字符串
char *match( char *s, char ch1, char ch2 )
{
    while(*s!='\0'){        
        if(*s==ch1){        
            for(char *s1=s;*s1!='\0';s1++){
                printf("%c",*s1);
                if(*s1==ch2)break;
            }printf("\n");
            return s;
        }s++;
    }printf("\n");
    return s;
}
查找子串
char *search( char *s, char *t )
{
    int i=0,j=0,k;
    for(i=0;s[i]!='\0';i++)
    {
        k=i;
        j=0;//每次比较都从t所指的第一个开始比较
        while(s[k]==t[j]&&s[k]!='\0'&&t[j]!='\0')
        //判断时要考虑两个是否为\0,如果有一个是则跳出
        {
            k++;
            j++;
        }
        if(j!=0&&t[j]=='\0')
            break;
    }
    if(s[i]!='\0')
    {
        s=i+s;      //注意先比较再加,否则可能会数组越值
        return s;
    }
    return NULL;
}
奇数值结点链表
/*
 * 从标准输入读入一系列正整数,按照读入顺序建立单链表
 */
struct ListNode *readlist() {
    // 建立一条带有头节点的单链表
    struct ListNode *head = (struct ListNode *) malloc(sizeof(struct ListNode));
    head->next = NULL;
    struct ListNode *tail = head;

    int number;
    scanf("%d", &number);

    while (number != -1) {
        // 临时节点
        struct ListNode *temp = (struct ListNode *) malloc(sizeof(struct ListNode));
        temp->data = number;
        temp->next = NULL;

        // 将临时节点链接到链表尾部
        tail->next = temp;
        // 更新尾节点
        tail = temp;

        scanf("%d", &number);
    }

    return head;
}

/*
 * 将单链表 L 中奇数值的结点分离出来,重新组成一个新的链表
 */
struct ListNode *getodd(struct ListNode **L) {
    // 建立一条带有奇数值链表头节点的单链表
    struct ListNode *oddHead = (struct ListNode *) malloc(sizeof(struct ListNode));
    oddHead->next = NULL;
    struct ListNode *oddTail = oddHead;

    // **L:指向指针 L 的指针,存放指针 *L 的地址,*L 中存放的是原链表头节点的地址
    struct ListNode *head = *L;
    // 因为原链表头节点不存储值,故从头节点的下一个节点开始遍历
    while (head->next != NULL) {
        // 链表中的值为奇数,则将其存进奇数值链表
        if (head->next->data % 2 != 0) {
            struct ListNode *oddTemp = (struct ListNode *) malloc(sizeof(struct ListNode));
            // 将原链表中的奇数值赋值给奇数值链表
            oddTemp->data = head->next->data;
            oddTemp->next = NULL;

            // 将临时节点连接到奇数值链表尾部
            oddTail->next = oddTemp;
            // 奇数值链表尾节点后移
            oddTail = oddTemp;

            // 应题目要求,需删掉原链表中的奇数值节点
            struct ListNode *temp = head->next;
            head->next = temp->next;
            free(temp);
        } else {
            head = head->next;
        }
    }

    // 因头节点不存储值,故头节点后移一个节点
    *L = (*L)->next;
    oddHead = oddHead->next;
    return oddHead;
}
单链表结点删除
struct ListNode *readlist()
{
    int num;
    struct ListNode *head,*p;
    head=(struct ListNode*)malloc(sizeof(struct ListNode));
    p=head;
    while(scanf("%d",&num )!=NULL&&num!=-1)
    {
        p->next =(struct ListNode*)malloc(sizeof(struct ListNode));
        p=p->next ;
        p->data =num;
        p->next=NULL;
    }
    head=head->next ;
    
    return (head);
}
struct ListNode *deletem( struct ListNode *L, int m )
{
    struct ListNode *p,*q;
    if(L==NULL)
    {
        return NULL;
    }
    p=L;q=p->next ;
    while(q)
    {
        if( q->data ==m )
        {
            p->next =q->next ;
            free(q);
            q=p->next ;
        }
        else 
        {
            p=p->next ;
            q=p->next ;
        }
    }
    if(L->data ==m )
    {
        L=L->next ;
    }
    
    return L;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值