学习笔记 简单的amob A%B Problem

【基础题目】A%B Problem

题目描述

C--语言是一种C的简化版,它仅有的三种运算符为++,--和==(没有=,+,-,*,/,%,<,>等任何其他运算符),也没有循环及goto语句,除此之外与C相同。使用C--编写一个函数int
mod(int a,int b),计算a除以b的余数。

——来自wweiyi暑假集训

题意简述:只用++,--,==运算符和C++的其他功能来完成a%b的功能

提示:允许调用其他函数

这是一道神奇的题目,我想了大半天才想出来,甚至引来了老师的批评,接下来我说一说我的思路

这道题我们需要只用++,--,==和C++的其他功能来实现模运算,这个看起开似乎无法实现,因为不能够使用循环,因此,这道题的阴影加深了。

递归!循环的后裔!

这里我们不能用循环,也就是我们需要使用类似循环的一个过程,递归来解决问题,递归是一种很常用的解决问题的方法,将一个大问题转换成一个子问题也许模运算就可以这样解决了。

++,--,==三运算符!三符成虎!

我们要解决模运算首先要解决减法运算的问题,因为a%b,就是a一直减b,减到a小于b为止,因此,我们可以先解决减法运算。

代码如下

int jian(int a,int b)
{
    if(b==0)
        return a;
    return jian(--a,--b);
}

这样就解决了减法运算;

但是顺便说一句,加法和乘法运算实际上也很简单,让我来把代码贴出来!

int add(int a,int b)
{
    if(b==0)
        return a;
    return add(++a,--b);
}
int cheng(int a,int b)
{
    if(b==0)
        return a;
    return add(a,cheng(a,--b));
}

我们可以轻松地解决减法,乘法和加法,但是模运算我们还是不知道,怎么办呢?

判断!事情的转机?

我们再次理清一下思路,我们需要a一直减b,一直减到a小于b为止,也就是mod(a,b)=mod(a-b,b),这就是神奇的递归式,就可以解决一部分问题,另一部分问题就是判断a小于b,我们可以a,b同时递减,看谁先到0,但由于这个问题的特殊性,当a=b时,需要特殊判断一下,因为一个数mod它的因数等于0,所以我们的思路就出来了,代码也就写出来了。

代码如下

#include <iostream>
using namespace std;
int pd(int a,int b)
{
	if(a==b)
	return 0;
	if(a==0)
	return 1;
	if(b==0)
	return 0;
	return pd(--a,--b);
}
int jian(int a,int b)
{
	if(b==0)
	return a;
	return jian(--a,--b);
}
int mod(int a,int b)
{
	if(pd(a,b)==1)
	return a;
	return mod(jian(a,b),b);
}
int main()
{
	int a,b;
	cin>>a>>b;
	cout<<mod(a,b)<<endl;
	return 0;
}
//wweiyi费时3小时智造
posted @ 2019-07-28 11:29  wweiyi  阅读(269)  评论(0编辑  收藏  举报
js脚本