C语言程序设计算法题 -- lab11(1045 - 1049) 最大公约数 LCM atof 查找字符串 RPN calculator

最大公约数

在这里插入图片描述


#include <stdio.h>

int GCD(int m,int n)
{
    int big = m > n ? m : n;
    int sma = m > n ? n : m;
    if(big % sma)
    {
        return GCD(sma, big % sma);
    }
    return sma;
}

int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    printf("GCD(%d,%d)=%d\n",m,n,GCD(m,n));
    return 0;
}

LCM

输入若干个数,求他们的最小公倍数

#include <stdio.h>
typedef long long ll;
#define N 9

ll GCD(ll m,ll n)
{
    ll big = m > n ? m : n;
    ll sma = m > n ? n : m;
    while(big % sma)
    {
        ll Remainer = big % sma;
        big = sma;
        sma = Remainer;
    }
    return sma;
}
long long LCM(int a[], int n)
{
 // precondition: 1≤n≤9, 1≤a[i]≤100
 // postcondition: return LCM of all integers 
    if(n == 1)
        return a[0];
        
    ll mul = 1;
    mul *= a[0];
    for(int i = 1; i < n; i++)
    {
        ll gcd = GCD(mul, a[i]);
        mul *= a[i] / gcd;
    }
    return mul;
}

int main()
{ 
   int i,n,a[N];
   for (scanf("%d",&n),i=0;i<n;i++) scanf("%d",&a[i]);
   printf("%lld\n", LCM(a,n));
   return 0;
}

atof

在这里插入图片描述

#include <stdio.h>

/***************************************************************/
/*                                                             */
/*  DON'T MODIFY main function ANYWAY!                         */
/*                                                             */
/***************************************************************/

double atof(char s[]) {
    double db = 0; // 整数部分
    int cnt = 0;
    int first = 0;
    double decimal = 0; // 小数部分
    int pow = 0; //幂部分
    int flag = 0;
    while(s[cnt] != 0)
    {
        if(s[cnt] == '.')
        {
            flag = 1;   
        }
        else if(s[cnt] == 'e' || s[cnt] == '+' || s[cnt] == 'E')
        {
            flag = 2;
        }
        else if(s[cnt] == '-')
        {
            if(cnt == 0)
                first = 1;
            else
                flag = 3;
        }
        else
        {
            if(flag == 0)
            {
                db *= 10;
                db += s[cnt] - '0';
            }
            if(flag == 1)
            {
                decimal *= 10;
                decimal += s[cnt] - '0';
            }
            if(flag == 2 || flag == 3)
            {
                pow *= 10;
                pow += s[cnt] - '0';
            }
        }
        cnt++;
    }
    
    while(decimal > 1)
        decimal /= 10;
    db += decimal;
    
    for(int i = 0; i < pow; i++)
    {
        if(flag == 3)
            db *= 0.1;
        else db *= 10;
    }
    if(first == 1) db = -db;
    return db;
}

#define MAXLINE 80  /* maximum input line length */

int main() {
    char s[MAXLINE];
    scanf("%s", s);
    printf("%f\n", atof(s));
}

查找字符串

在这里插入图片描述



int strReverseIndex(char s[],char t[ ]);

#include <stdio.h>
#include<string.h>

void GetNext(int next[],const char t[])//t为模式串
{
    int i,j,len;
    next[0]=-1;
    for(j=1;t[j]!='\0';j++)
    {
        for(len=j-1;len>=1;len--)//长度肯定要比当前字符串小1个。
        {
            for(i=0;i<len;i++)
            {
                if(t[i]!=t[j-len+i])
                    break;
            }
            if(i==len)
            {
                next[j]=len;
                break;
            }

        }
        if(len<1)
            next[j]=0;
    }
}


int strReverseIndex(char s[],char t[])
{
    // Brute Force都会 来点KMP
    int i=0, j=0;
    int tlen = strlen(t);
    for(int k = 0; k < tlen / 2; k++) // 这里是从右往左,所以s和t要反过来
    {
        int interim = t[k];
        t[k] = t[tlen - 1 - k];
        t[tlen - 1 - k] = interim;
    }
    int slen = strlen(s);
    for(int k = 0; k < slen / 2; k++) 
    {
        int interim = s[k];
        s[k] = s[slen - 1 - k];
        s[slen - 1 - k] = interim;
    }
    
    int next[80];
    GetNext(next, t);
    while(s[i]!='\0'&&t[j]!='\0')
    {
        if(s[i]==t[j])
        {
            i++;
            j++;
        }
        else
        {
            j=next[j];
            if(j==-1)
            {
                i++;
                j++;
            }
        }
    }
    
    if(t[j]=='\0')
        return(slen - i);
    else
        return -1;

}

#define N 80
int main()
{
    char s[N+1],t[N+1];
    scanf("%s%s",s,t);
    printf("%d\n",strReverseIndex(s,t));
    return 0;
}


RPN calculator

在这里插入图片描述

// 有数字先存数字
// 遇见运算符就拿头顶的两个数字进行计算
// 再把结果存回去
#include<stdio.h>
#include<string.h>
int main()
{
    int stack[10000];
    char str[10000];
    memset(str, 0, sizeof(str));
    gets(str);
    int data = 0;
    int neg = 0;
    int cnt = 0; // str
    int top = 0; // stack
    int flag = 0;
    int a, b;
    while(str[cnt] != 0)
    {
        switch(str[cnt])
        {
        case'1':case'2':case'3':case'4':
        case'5':case'6':case'7':case'8':
        case'9':case'0':
        
            data *= 10;
            data += str[cnt] - '0';
            flag = 1; 
        break;
        
        case' ':
            if(flag)// 没有数字的空格不需要存进去stack
            {
                if(neg == 1)
                	stack[top++] = 0-data;
                else
                    stack[top++] = data;
                neg = 0;
                data = 0;
                flag = 0;
            }
            
        break;
        
        case'-':
            if(str[cnt + 1] != ' ' && str[cnt + 1] != 0)
            {
                neg = 1;
            }
            else
            {
                b = stack[--top];
                a = stack[--top];
                stack[top++] = a - b;
            }
        break;
        case'+':
            {
                b = stack[--top];
                a = stack[--top];
                stack[top++] = a + b;
            }
        break;
        case'/':
            b = stack[--top];
            a = stack[--top];
            stack[top++] = a / b;
        break;
        case'*':
            b = stack[--top];
            a = stack[--top];
            stack[top++] = a * b;
        break;
        case'\%':
            b = stack[--top];
            a = stack[--top];
            stack[top++] = a % b;
        break;
        }
        cnt++;
    }
    printf("%d", stack[0]);
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值