如何仅使用添加和分配执行乘法
How to perform a multiplication using only additions and assignments?
如何更改以下程序,以便执行相同的任务,但仅使用加法和作业?
i只能进行最大27个添加,并且必须在单个输入中生成输出。循环和其他控制流操作是不允许
#include <iostream>
int main()
{
int a;
std::cout << "Enter number: ";
std::cin >> a;
std::cout << a*29 << std::endl;
return 0;
}
另一种需要7 +
的方法:
int M1 = a; // 1a
int M2 = M1 + M1; // 2a
int M4 = M2 + M2; // 4a
int M8 = M4 + M4; // 8a
int M16 = M8 + M8; // 16a
int res = M16 + M8 + M4 + M1; // 29a
结果是由乘数的二进制模式构造的,即29个小数为0001.1101二进制。因此,我们需要添加M16,M8,M4和M1(并排除M2)。
这不是一般的,也不是,而是仅乘以29,您可以做到这一点:
// x is input
int t = x; // x*1
x = x + x;
x = x + x;
t = t + x; // x*5
x = x + x;
t = t + x; // x*13
x = x + x;
t = t + x; // x*29
这只是展开的二进制乘法,就像类似的答案一样,但没有命名临时结果。t
的添加对应于29中的设置位。
这样,您可以使用21个添加。
#include <iostream>
int main()
{
int a;
std::cout << "Enter number: ";
std::cin >> a;
int b = (a+a+...+a) // 10 times
b = b + b;
b = b + (a + a + a ... + a ); // 9 times
std::cout << b << std::endl;
return 0;
}
您可以使用其他var吗?
b = a + a + a//3 times a
b = b + b + b//9 times a
b = b + b + b//27 times a
b = b + a + a//29 times a
乘法只是重复的添加。为此使用循环。您知道您的循环应该执行多少次吗?是的!因此,请使用一个进行循环。
所以这是计划:
- 获取输入
- 使用一个用于循环执行加法
- 输出
sum
示例:
// get input
int input;
std::cout << "Enter number: ";
std::cin >> input;
// use a for loop to perform the addition
int sum = 0;
for(int i = 0; i< 29; ++i)
sum += a;
// output result
std::cout << sum << std::endl;
,retrepetive添加是乘法 - 数学上
因此,对于n
次数,重复添加a
。简单的for/while
循环可以做到这一点
#include <iostream>
int main()
{
int a,i,temp=0;
std::cout << "Enter number: ";
std::cin >> a;
for(i=1;i<=29;i++)
temp+=a;//add a repeatedly for 'n' number of times. Here 29 as per your requirement. a*n
std::cout << temp <<std::endl;
return 0;
}
没有循环
int b=0,result=0;
b=a+a+a+a+a+a+a;\adding for 7 times
result=b+b+b+b+a;\4 times 7 (of a)= 28+a= 29 times (of a).
这涉及10个添加。
您可以尝试 -
b = a + a + a + a + a + a + a + a + a + a + a + a + a + a + a; // equivalent to a*15
b += b -a;
如果仅允许使用+
和=
,并且不允许通过引入其他变量作弊,则除非您沉迷于未定义的行为,让自己允许自己的形式
... + (a += ...) + ...
其中...
是任何数量的a +
。这里的诀窍是(a += ...)
通过评估表达式更改a
部分的值。
可能是诱惑,可惜这是不是便携式C ,因为+=
和+
不是测序点。在您的教室编译器上,您也许可以使此功能正常工作。
请参阅https://ideone.com/fc3fai,您可以看到
(a + a + a + a + a + (a += a + a + a) + a + a + a + a + a)
在该特定的编译器上完成工作(在写作时)。(就其价值而言,它在表达式定义明确的Java中也可以做正确的事情)。
您可以多次添加值:
int sum=0;
for(int i=0; i<multipler; i++){
sum+=a; //adds value of a to itself
}
return sum;
如果您只想乘以2个,则可以向左移动:
a = a << 1;
相关文章:
- 以下代码执行哪种内存分配(动态或静态)?
- C++将一个指针分配给另一个指针时执行的类型检查
- 释放动态分配的内存时是否需要执行此额外步骤
- 为什么在 C++ 执行删除操作后仍可以访问释放的动态分配的内存
- 在标准输出中执行打印会导致数组中随机分配值
- 为什么在执行增量操作之前分配指针值
- 有没有办法获得功能大小并分配内存以复制和执行
- C++标准库中是否有保证不执行动态内存分配的函数或类
- 如何仅使用添加和分配执行乘法
- 在执行中脱离堆栈对象的范围之前,请分配堆栈对象
- 如何分配可执行的内存缓冲区
- 如何直接从分配的内存中执行mmaped二进制文件/代码
- 如何制作进程以及它们执行不同的分配任务,例如使用fork读取文件或写入文件
- c++:执行动态分配的新运算符检查内存安全性
- 如何在C++中通过将每个命令分配给线程来同时执行linux系统命令
- 如何在 Linux 下为可执行文件分配堆栈
- C++ 如何在矢量指针上执行项分配
- OpenMP将函数的执行分配给线程
- 我可以在两个istream_iterators之间执行分配操作吗?
- c++程序在执行分配内存的函数时崩溃