您的位置:首页 > 其它

NYOJ91 阶乘之和 与全加器设计Verilog HDL

2015-05-05 16:48 218 查看

阶乘之和

时间限制:3000 ms | 内存限制:65535 KB
难度:3

描述
给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;

输入第一行有一个整数0<m<100,表示有m组测试数据;

每组测试数据有一个正整数n<1000000;输出如果符合条件,输出Yes,否则输出No;样例输入
2910

样例输出
YesNo

上传者

AC 代码

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a[10] = {1,2,6,24,120,720,5040,40320,362880};
int n, m ;
scanf("%d", &n);
while(n--)
{
scanf("%d", &m);
for(int i = 8; i>=0; i--)
{//贪心思想每次先装最大的
if(m >= a[i])
{
m-=a[i];
}
}
if(m == 0)
{
//如果最后是0 的话那么代表这个玩意可以用阶层表示的
printf("Yes\n");
}
else
{
printf("No\n");
}
}

return 0;
}


解题思路主要是贪心思路即可求解

下面是全加器的 一般是真值表, 然后化简卡罗图, 最后实现表达式

下面主要采用门级建模实现的, 具体的全加器的电路其实看代码就可以知道的

看代码:

module fulladd(a, b, cin,cout, sum);
//输入输出端口说明
input a,b,cin;
output sum, cout;
//信号类型说明
wire s1,c2,c1;
xor(s1,a,b);
and(c1, a,b);
xor(sum, s1, cin);
and(c2 ,s1,cin);
xor(cout,c2,c1);

endmodule


下面是行为建模

看些test bench测试文件

module twb;

// Inputs
reg a;
reg b;
reg cin;

// Outputs
wire cout;
wire sum;

// Instantiate the Unit Under Test (UUT)
counter uut (
.a(a),
.b(b),
.cin(cin),
.cout(cout),
.sum(sum)
);

initial begin
// Initialize Inputs
a = 0;
b = 0;
cin = 0;

// Wait 100 ns for global reset to finish
#10;
a = 1'b1; b = 1'b0 ; cin = 1'b1;
#10 a = 1'b0; b = 1'b1 ; cin = 1'b1;

#10  a = 1'b1; b = 1'b1 ; cin = 1'b1;
#10  a = 1'b1; b = 1'b0 ; cin = 1'b0;

// Add stimulus here

end

endmodule
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: