c语言不用除法 求余数,不用 "%" && "/" 编程实现两个正整数的除法,取余数

题目描述:编程实现两个正整数的除法,当然不能用除法操作符。

// return x/y.

int div(const int x, const int y)

{

....

}

位移运算的方法:

#include

intdiv(constintx,constinty)

{

intdividend = x, multi, result = 0;

while(dividend >= y)

{

multi = 1;

while( multi * y <= (dividend >> 1) )

{

multi <<= 1;

}

result += multi;

dividend -= multi * y;

}

returnresult;

}

intmain()

{

intx, y;

while( scanf("%d %d", &x, &y) != EOF )

{

printf("%d÷%d=%d/n", x, y, div(x, y));

}

return0;

} ——————————————————————————————————————————————————

个人的想法:

x/y=(x-y)/y+1

=(x-y-y)/y+2

...

=(x-n*y)/y+n

=....

结束的条件为:x-n*y>=y,并且,x-(n+1)*y

此时,n即为所求。

题目还可以稍微转换一下描述,比如,不使用 "%" && "/" 求 a % b。

步骤:

1,利用上面的方法求得[x/y],代替取整;

2,a%b=a-b*[a/b]

___________________________________________________________________________________________________

解法

1. f(x,y) = f(y, y%x) (y>0) 辗转相除法

2. 取模运算较为耗时, 将取模变成相减. 但对极端数据效果很差, 比如 gcd(1000,1)

3. 分析公约数的特点.

3.1 若 x,y 均为偶数, 那么 f(x,y) = 2*f(x/2, y/2)

3.2 若 x 为偶数, y 为奇数, 那么 f(x,y) = 2*f(x/2, y)

3.3 若都为奇数, f(x,y) = f(x, x-y) 那么下一步肯定有一个偶数

3.4 这样一来, 时间复杂度下降到 o(log(max(x,y)))

### 如何在 Verilog 中实现余数运算 为了实现在硬件描述语言(HDL)如Verilog中的余数操作,可以采用基于减法的算法来模拟除法过程。这种方法通过不断从被除数中减去除数直到剩余部分小于除数为止;此时剩下的数值就是所得的余数[^3]。 下面是一个简单的例子展示如何利用模块化的方式,在Verilog里创建一个能够执行给定两数间模运算的功能: ```verilog module mod_divider( input wire clk, // Clock signal input wire rst_n, // Asynchronous reset active low input wire start, // Start operation flag input wire [7:0] dividend,// Dividend value input wire [7:0] divisor, // Divisor value output reg ready, // Operation complete flag output reg [7:0] remainder// Remainder result ); reg [7:0] temp; integer i; always @(posedge clk or negedge rst_n) begin : proc_modulo if (!rst_n) begin ready <= 0; remainder <= 8'b0; temp <= 8'b0; end else if (start && !ready) begin temp <= dividend; // Load the initial value of dividend into temporary register. for(i=0;i<8;i=i+1)begin if(temp >= divisor) begin temp <= temp - divisor; end temp <= {temp[6:0],1'b0}; // Shift left to process next bit. end remainder <= temp; // Store final remainder after all iterations. ready <= 1; // Signal that calculation is done. end else begin ready <= 0; // Clear ready status until new computation starts. end end endmodule ``` 此代码片段定义了一个名为`mod_divider`的模块,该模块接收时钟信号、异步复位信号以及启动标志作为输入,并接受两个8位宽的操作数——被除数(dividend)和除数(divisor),最后输出计算完成的状态指示符(ready)及所得余数(remainder)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值