最大公约数

#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]);
}
441

被折叠的 条评论
为什么被折叠?



