首页 > 其他题解 > 顶嵌杯C语言编程大赛初赛解题代码

顶嵌杯C语言编程大赛初赛解题代码

第二届顶嵌杯C语言编程大赛已经结束,现在公布本人代码,希望与大家共同进步。

A题代码如下:

#include <stdio.h>
#include <math.h>

int gcd(int a, int b)
{
	int r;
	while(b)
	{
		r = a % b;
		a = b;
		b = r;
	}
	return a;
}

int main(int argc, char **argv)
{
	int a, b, c, d;
	int resa, resb, tmp;
	char op;
	
	while(EOF != scanf("%d/%d%c%d/%d", &a, &b, &op, &c, &d))
	{
		/*Calculate the result*/
		resb = b * d;
		if(op == '+')
		{
			resa = (a * d) + (c * b);
		}
		else
		{
			resa = (a * d) - (c * b);
		}
		/*Print the result*/
		if(0 == resa)
		{
			printf("0\n");
		}
		else if((resa * resa) % (resb * resb) == 0)
		{
			printf("%d\n", resa / resb);
		}
		else
		{
			tmp = gcd(resa, resb);
			if(resa * resb > 0)
			{
				printf("%d/%d\n", resa / tmp, resb / tmp);
			}
			else
			{
				printf("-%d/%d\n", abs(resa / tmp), abs(resb / tmp));
			}
		}
	}
	
	return 0;
}

B题代码如下:

#include <stdio.h>

int mod(int a, int b)
{
	while(a >= b)
	{
		a -= b;
	}
	return a;
}

int main(int argc, char **argv)
{
	int a, b;
	while(EOF != scanf("%d %d", &a, &b))
	{
		printf("%d\n", mod(a, b));
	}
	
	return 0;
}

C题代码如下:

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

#define MAX_LEN 1024

int main(int argc, char **argv)
{
	char str[MAX_LEN];
	int i, len;
	
	while(gets(str))
	{
		len = strlen(str);
		for(i = 0; i < len; ++i)
		{
			if('y' != str[i])
			{
				putchar(str[i]);
			}
			else
			{
				if(i + 2 < len && str[i+1] == 'o' && str[i+2] == 'u')
				{
					putchar('w');
					putchar('e');
					i += 2;
				}
				else
				{
					putchar(str[i]);
				}
			}
		}
		putchar('\n');
	}
	
	return 0;
}

D题代码如下:

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

#define MAX_LEN 1024

void BigIntegerAdd(const char a[], const char b[], char res[])
{
	int i, j, k;
	int x, y, z;
	int up, l;
	
	char *c;
	
	if(strlen(a) > strlen(b))
	{
		l = strlen(a) + 2;
	}
	else
	{
		l = strlen(b) + 2;
	}
	
	c = (char *)malloc(l * sizeof(char));
	i = strlen(a) - 1;
	j = strlen(b) - 1;
	k = up = 0;
	
	while(i >= 0 || j >= 0)
	{
		x = i < 0 ? '0' : a[i];
		y = j < 0 ? '0' : b[j];
		z = x - '0' + y - '0';
		if(up)
		{
			++z;
		}
		if(z > 9)
		{
			up = 1;
			z -= 10;
		}
		else
		{
			up = 0;
		}
		c[k++] = z + '0';
		--i;
		--j;
	}
	
	if(up)
	{
		c[k++] = '1';
	}
	i = 0;
	c[k] = '\0';
	
	for(k -= 1; k >= 0; --k)
	{
		res[i++] = c[k];
	}
	res[i] = '\0';
	
	free(c);
}

int main(int argc, char **argv)
{
	char a[4][MAX_LEN];
	int i, n = 99;
	while(EOF != scanf("%s %s %s", a[0], a[1], a[2]))
	{
		for(i = 3; i <= 99; ++i)
		{
			BigIntegerAdd(a[0], a[1], a[3]);
			BigIntegerAdd(a[2], a[3], a[3]);
			strcpy(a[0], a[1]);
			strcpy(a[1], a[2]);
			strcpy(a[2], a[3]);
		}
		printf("%s\n", a[3]);
	}
	return 0;
}

 


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 顶嵌杯C语言编程大赛初赛解题代码
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. 2010年11月27日10:08 | #1

    A题的这句
    if((resa * resa) % (resb * resb) == 0)是什么意思呢?为什么不直接用resa%resb,而是平方之后再取余呢?计算机的求余结果的符号和分子是一样的
    B题那个可以直接用a-a/b*b得到余数

    [回复]

  2. 2010年11月27日12:00 | #2

    @Klion26
    是的 当时没多想就写了减法。那个(resa * resa) % (resb * resb)多余……当时没考虑到WA了一次 可以直接(resa * resa) % (resb * resb)

    [回复]

    逆态度 回复:

    @代码疯子, 上面的网友的意思直接if(resa%resb)

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.