1296 - 韩信点兵

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

淮安民间传说着一则故事——“韩信点兵”,其次有成语“韩信点兵,多多益善”。韩信带1500名兵士打仗,战死四五百人,站3人一排,多出2人;站5人一排,多出4人;站7人一排,多出6人。韩信马上说出人数:1049。如果我给你一些条件,你能给我满足条件的最小正整数么?

当然,这道题是简单的。给你的每组数据有三行数字,每行数字的第一个数是除数 d ,第二个数是余数 m,然后请你求出一个最小的正整数 n(n < 1000,000),此n能使这三行数字同时满足 n/d == x……m.

题目输入

第一行是数据的组数 nCase (n<=5),以下有3nCase行。每三行是一组数据,就是给你的三对数据。

题目输出

对于每组输入,输出一行,是所求得的最小正整数。

输入/输出样例

输入格式

2
3 2
5 4
7 6
9 2
7 3
6 5

输出格式

104
101

C语言解答

#include<stdio.h>
int max2(a, b)
{
	if (a > b)
	{
		return a;
	}
	else
	{
		return b;
	}
}
int max3(a, b, c)
{
	return(max2(a, max2(b, c)));
}
int main()
{
	int nCase;
	int i,j;
	int flag;
	int mod[3] = { 0 }, line[3] = { 0 };
	long number;
	int round;
	scanf("%d", &nCase);
	for (i = 1; i <= nCase; i++)
	{
		for (j = 0; j < 3; j++)
		{
			scanf("%d %d", line + j, mod + j);
		}
		round = max3(*line, *(line + 1), *(line + 2));
		for (j = 0; j < 3; j++)
		{
			if (*(line + j) == round)
			{
				flag = *(mod + j);
				break;
			}
		}
		for (number = round + flag;; number = number + round)
		{
			if (number % line[0] == mod[0] && number % line[1] == mod[1] && number % line[2] == mod[2])
			{
				printf("%ld\n", number);
				break;
			}
		}
	}
}

C++解答

#include<cstdio>
int main()
{
	int n,d1,m1,d2,m2,d3,m3;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d %d %d %d %d %d",&d1,&m1,&d2,&m2,&d3,&m3);
		for(int j=1;j<=1000000;j++)
			if(j%d1==m1&&j%d2==m2&&j%d3==m3)
			{
				printf("%d\n",j);
				break;
			}
	}
}